diff --git a/build.sbt b/build.sbt index 7000d0b..d265402 100644 --- a/build.sbt +++ b/build.sbt @@ -15,7 +15,9 @@ scalacOptions ++= Seq("-feature","-deprecation") homepage := Some(url("http://github.com/greencatsoft/scalajs-angular")) libraryDependencies ++= Seq( - "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6") + "org.scala-lang.modules.scalajs" %%% "scalajs-dom" % "0.6", + "org.scala-lang" % "scala-reflect" % scalaVersion.value % "compile" +) publishTo := { val nexus = "https://oss.sonatype.org/" diff --git a/src/main/scala/com/greencatsoft/angularjs/Angular.scala b/src/main/scala/com/greencatsoft/angularjs/Angular.scala index 62b88ad..bb4f1b4 100644 --- a/src/main/scala/com/greencatsoft/angularjs/Angular.scala +++ b/src/main/scala/com/greencatsoft/angularjs/Angular.scala @@ -1,15 +1,19 @@ package com.greencatsoft.angularjs import scala.language.implicitConversions -import scala.scalajs.js +import scala.scalajs.js.JSConverters.genTravConvertible2JSRichGenTrav import org.scalajs.dom.Element -import com.greencatsoft.angularjs.element.AngularElement +object Angular { -trait Angular extends js.Object { + import internal.angular - def module(name: String, require: js.Array[String]): Module = ??? + def apply(name: String): Option[Module] = + angular.module(name).toOption.map(new Module(_)) - implicit def element(elem: Element): AngularElement + def module(name: String, dependencies: Seq[String] = Nil): Module = + new Module(angular.module(name, dependencies.toJSArray)) + + implicit def element(elem: Element): AngularElement = angular.element(elem) } diff --git a/src/main/scala/com/greencatsoft/angularjs/element/AngularElement.scala b/src/main/scala/com/greencatsoft/angularjs/AngularElement.scala similarity index 87% rename from src/main/scala/com/greencatsoft/angularjs/element/AngularElement.scala rename to src/main/scala/com/greencatsoft/angularjs/AngularElement.scala index 295dc46..142127a 100644 --- a/src/main/scala/com/greencatsoft/angularjs/element/AngularElement.scala +++ b/src/main/scala/com/greencatsoft/angularjs/AngularElement.scala @@ -1,4 +1,4 @@ -package com.greencatsoft.angularjs.element +package com.greencatsoft.angularjs import scala.language.implicitConversions import scala.scalajs.js diff --git a/src/main/scala/com/greencatsoft/angularjs/Annotations.scala b/src/main/scala/com/greencatsoft/angularjs/Annotations.scala new file mode 100644 index 0000000..fd9deab --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Annotations.scala @@ -0,0 +1,7 @@ +package com.greencatsoft.angularjs + +import scala.annotation.StaticAnnotation + +class inject extends StaticAnnotation + +class injectable(name: String) extends StaticAnnotation \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/Config.scala b/src/main/scala/com/greencatsoft/angularjs/Config.scala new file mode 100644 index 0000000..8078585 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Config.scala @@ -0,0 +1,3 @@ +package com.greencatsoft.angularjs + +trait Config extends Service with Initializable diff --git a/src/main/scala/com/greencatsoft/angularjs/ConfigBuilder.scala b/src/main/scala/com/greencatsoft/angularjs/ConfigBuilder.scala deleted file mode 100644 index f0accb0..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/ConfigBuilder.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.greencatsoft.angularjs - -import scala.scalajs.js - -trait ConfigBuilder { - - def buildConfig(config: js.Dictionary[js.Any] = js.Dictionary.empty): js.Dictionary[js.Any] = config -} diff --git a/src/main/scala/com/greencatsoft/angularjs/Controller.scala b/src/main/scala/com/greencatsoft/angularjs/Controller.scala new file mode 100644 index 0000000..e8231a8 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Controller.scala @@ -0,0 +1,17 @@ +package com.greencatsoft.angularjs + +import scala.scalajs.js + +import com.greencatsoft.angularjs.core.ScopeAware + +trait Controller extends NamedService with Initializable with ScopeAware { + + abstract override def initialize() { + super.initialize() + scope.dynamic.controller = this.asInstanceOf[js.Object] + } +} + +trait PageController extends Controller with Templated + +trait TitledPageController extends PageController with Titled diff --git a/src/main/scala/com/greencatsoft/angularjs/Directive.scala b/src/main/scala/com/greencatsoft/angularjs/Directive.scala new file mode 100755 index 0000000..18f228c --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Directive.scala @@ -0,0 +1,233 @@ +package com.greencatsoft.angularjs + +import scala.language.experimental.macros +import scala.language.implicitConversions +import scala.scalajs.js +import scala.scalajs.js.Any.{ fromBoolean, fromFunction2, fromFunction4, fromString, wrapArray } +import scala.scalajs.js.UndefOr +import scala.scalajs.js.UndefOr.undefOr2ops +import scala.scalajs.js.annotation.JSBracketAccess + +import org.scalajs.dom.Element + +import com.greencatsoft.angularjs.core.Scoped +import com.greencatsoft.angularjs.internal.{ ConfigBuilder, Configuration, ServiceProxy } + +trait Directive extends NamedService with Function0[Configuration] with Scoped with ConfigBuilder { + + import internal.{ Angular => angular } + + override def apply(): Configuration = buildConfig() + + override def buildConfig(config: Configuration): Configuration = { + def bind(scope: ScopeType): ScopeType = { + scope.dynamic.directive = this.asInstanceOf[js.Object] + scope + } + + config("link") = (scope: ScopeType, elems: js.Array[Element], attrs: Attributes, controllers: UndefOr[js.Any]) => { + controllers.toOption match { + case Some(arr) if js.Array.isArray(arr) => + val args = arr.asInstanceOf[js.Array[js.Any]].toSeq.map(ServiceProxy.unbind[Controller](_)).flatten + link(bind(scope), elems, attrs, args: _*) + case Some(c) => + ServiceProxy.unbind[Controller](c) match { + case Some(arg) => link(bind(scope), elems, attrs, arg) + case _ => link(bind(scope), elems, attrs) + } + case None => link(bind(scope), elems, attrs) + } + } + + controller.foreach(config("controller") = _) + + super.buildConfig(config) + } + + def controller(): Option[js.Any] = None + + protected def proxy[A <: Controller](target: A): js.Any = macro ServiceProxy.newInstance[A] + + def link(scope: ScopeType, elems: Seq[Element], attrs: Attributes, controller: Controller*): Unit = Unit +} + +trait Attributes extends js.Object { + + val $attr: js.Dictionary[String] = ??? + + def $addClass(classVal: String): Unit = ??? + + def $removeClass(classVal: String): Unit = ??? + + def $updateClass(newClasses: String, oldClasses: String): Unit = ??? + + @JSBracketAccess + def apply(name: String): UndefOr[String] = ??? + + @JSBracketAccess + def update(name: String, value: String): Unit = ??? + + def $get(name: String): UndefOr[String] = ??? + + def $set(name: String, value: String): Unit = ??? + + def $observe(key: String, fn: js.Function1[String, Unit]): Unit = ??? +} + +trait Requires extends ConfigBuilder { + this: Directive => + + var requirements = Set.empty[Requirement] + + abstract override def buildConfig(config: Configuration): Configuration = { + config("require") = js.Array[String](requirements.toSeq.map(_.toString): _*) + + super.buildConfig(config) + } + + case class Requirement(name: String, lookup: Boolean, optional: Boolean = false) { + + override def toString = (if (lookup) "^" else "") + (if (optional) "?" else "") + name + } + + def ^(requirement: NamedService) = new Requirement(requirement.name, true) + + def ^?(requirement: NamedService) = new Requirement(requirement.name, true, true) + + def ?(requirement: NamedService) = new Requirement(requirement.name, false, true) + + implicit def ~(requirement: NamedService) = new Requirement(requirement.name, false) +} + +trait RestrictedDirective extends Directive with ConfigBuilder { + + def restrict: Set[String] = Set.empty + + abstract override def buildConfig(config: Configuration): Configuration = { + config("restrict") = restrict.mkString + + super.buildConfig(config) + } +} + +trait ElementDirective extends RestrictedDirective { + + override def restrict = super.restrict + "E" + + var transclude = false + + var replace = false + + abstract override def buildConfig(config: Configuration): Configuration = { + config("transclude") = transclude + config("replace") = replace + + super.buildConfig(config) + } +} + +trait AttributeDirective extends RestrictedDirective { + + override def restrict = super.restrict + "A" +} + +trait ClassDirective extends RestrictedDirective { + + override def restrict = super.restrict + "C" +} + +trait CommentDirective extends RestrictedDirective { + + override def restrict = super.restrict + "M" +} + +trait ScopeStrategy extends ConfigBuilder { + this: Directive => +} + +trait InheritParentScope extends ScopeStrategy { + this: Directive => + + override def buildConfig(config: Configuration): Configuration = { + config("scope") = true + + super.buildConfig(config) + } +} + +trait UseParentScope extends ScopeStrategy { + this: Directive => + + override def buildConfig(config: Configuration): Configuration = { + config("scope") = false + + super.buildConfig(config) + } +} + +trait IsolatedScope extends ScopeStrategy { + this: Directive => + + var bindings = Seq.empty[ScopeBinding] + + override def buildConfig(config: Configuration): Configuration = { + val dict = js.Dictionary.empty[String] + + bindings foreach { b => + dict(b.name) = s"${b.prefix}${b.attribute}" + } + + config("scope") = dict + + super.buildConfig(config) + } + + abstract class ScopeBinding(val prefix: String) { + + val name: String + + val attribute: String + } + + case class UnidirectionalBinding(name: String, attribute: String = "") extends ScopeBinding("=") + + case class BidirectionalBinding(name: String, attribute: String = "") extends ScopeBinding("@") + + case class BehavioralBinding(name: String, attribute: String = "") extends ScopeBinding("&") + + implicit class BindingBuilder(name: String) { + + def :=(attribute: String = ""): ScopeBinding = UnidirectionalBinding(name, attribute) + + def :@(attribute: String = ""): ScopeBinding = BidirectionalBinding(name, attribute) + + def :&(attribute: String = ""): ScopeBinding = BehavioralBinding(name, attribute) + } +} + +trait TemplatedDirective extends ConfigBuilder with Templated { + this: Directive => + + def getTemplateUrl(elems: Seq[AngularElement], attrs: Attributes): String = templateUrl + + abstract override def buildConfig(config: Configuration): Configuration = { + config("templateUrl") = (elems: js.Array[AngularElement], attrs: Attributes) => getTemplateUrl(elems, attrs) + + super.buildConfig(config) + } +} + +trait TemplateSourceDirective extends ConfigBuilder with TemplateSource { + this: Directive => + + val template: String + + def getTemplate(elems: Seq[AngularElement], attrs: Attributes): String = template + + abstract override def buildConfig(config: Configuration): Configuration = { + config("template") = (elems: js.Array[AngularElement], attrs: Attributes) => getTemplate(elems, attrs) + + super.buildConfig(config) + } +} + diff --git a/src/main/scala/com/greencatsoft/angularjs/Factory.scala b/src/main/scala/com/greencatsoft/angularjs/Factory.scala index 46aaad2..6cbcdc5 100644 --- a/src/main/scala/com/greencatsoft/angularjs/Factory.scala +++ b/src/main/scala/com/greencatsoft/angularjs/Factory.scala @@ -1,6 +1,3 @@ package com.greencatsoft.angularjs -trait Factory[A] extends NamedTarget with Function0[A] { - - override def initialize(): Unit = Unit -} \ No newline at end of file +trait Factory[A] extends NamedService with Function0[A] diff --git a/src/main/scala/com/greencatsoft/angularjs/Initializable.scala b/src/main/scala/com/greencatsoft/angularjs/Initializable.scala new file mode 100644 index 0000000..0555429 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Initializable.scala @@ -0,0 +1,6 @@ +package com.greencatsoft.angularjs + +trait Initializable { + + def initialize(): Unit = Unit +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/Injectable.scala b/src/main/scala/com/greencatsoft/angularjs/Injectable.scala deleted file mode 100644 index 9be6e4c..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/Injectable.scala +++ /dev/null @@ -1,5 +0,0 @@ -package com.greencatsoft.angularjs - -import scala.scalajs.js - -trait Injectable extends js.Object diff --git a/src/main/scala/com/greencatsoft/angularjs/InjectionTarget.scala b/src/main/scala/com/greencatsoft/angularjs/InjectionTarget.scala deleted file mode 100644 index cd94a86..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/InjectionTarget.scala +++ /dev/null @@ -1,12 +0,0 @@ -package com.greencatsoft.angularjs - -import scala.scalajs.js - -trait InjectionTarget { - - def dependencies: Seq[String] = Nil - - def inject(args: Seq[js.Any]): Unit = None - - def initialize(): Unit -} diff --git a/src/main/scala/com/greencatsoft/angularjs/Module.scala b/src/main/scala/com/greencatsoft/angularjs/Module.scala index e5d1d11..24b5cab 100755 --- a/src/main/scala/com/greencatsoft/angularjs/Module.scala +++ b/src/main/scala/com/greencatsoft/angularjs/Module.scala @@ -1,137 +1,21 @@ package com.greencatsoft.angularjs -import scala.scalajs.js -import scala.scalajs.js.Any.{ fromFunction10, fromString } -import scala.scalajs.js.ThisFunction10 -import scala.scalajs.js.UndefOr -import com.greencatsoft.angularjs.controller.Controller -import com.greencatsoft.angularjs.directive.Directive +import scala.language.experimental.macros -trait Module extends js.Object { - - def factory(name: String, constructor: js.Array[js.Any]): Module = ??? - - def controller(name: String, constructor: js.Array[js.Any]): Module = ??? - - def config(constructor: js.Array[js.Any]): Module = ??? - - def run(constructor: js.Array[js.Any]): Module = ??? - - def directive(name: String, directiveFactory: js.Array[js.Any]): Module = ??? -} - -object Module { - - def apply(module: Module) = new ModuleProxy(module) - - def asService(target: InjectionTarget)(fn: js.Array[js.Any] => Unit) { - require(target != null, "Missing argument 'target'.") - - val handler = new ThisFunction10[js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, Unit] { - override def apply(t: js.Any, a0: js.Any, a1: js.Any, a2: js.Any, a3: js.Any, a4: js.Any, - a5: js.Any, a6: js.Any, a7: js.Any, a8: js.Any, a9: js.Any) { - - bindTarget(t, target) - - target.inject(Seq(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)) - target.initialize() - } - } - - val args = js.Array[js.Any]() - - target.dependencies.foreach(args.push(_)) - args.push(handler) - - handler.asInstanceOf[js.Dynamic].obj = target.asInstanceOf[js.Object] - - fn(args) - } - - private[angularjs] def bindTarget(service: js.Any, target: InjectionTarget) { - try { - service.asInstanceOf[js.Dynamic]._serviceTarget = target.asInstanceOf[js.Object] - } catch { - case _: Throwable => - } - } - - private[angularjs] def unbindTarget[A <: InjectionTarget](service: js.Any): Option[A] = { - val target: UndefOr[Any] = service.asInstanceOf[js.Dynamic]._serviceTarget - - target.map(_.asInstanceOf[A]).toOption - } -} - -class ModuleProxy(val module: Module) { +class Module private[angularjs] (val module: internal.Module) { require(module != null, "Missing argument 'module'.") - import Module.asService - - def factory(target: Factory[_]*): this.type = { - require(target != null, "Missing argument 'target'.") - - def registerFactory(f: Factory[_]) { - val handler = (a0: js.Any, a1: js.Any, a2: js.Any, a3: js.Any, a4: js.Any, - a5: js.Any, a6: js.Any, a7: js.Any, a8: js.Any, a9: js.Any) => { - f.inject(Seq(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)) - f.initialize() - f() - } - - val args = js.Array[js.Any]() - - f.dependencies.foreach(args.push(_)) - args.push(handler) - - module.factory(f.name, args) - } - - target.foreach(registerFactory(_)) - this - } - - def config(target: InjectionTarget*): this.type = { - require(target != null, "Missing argument 'target'.") - - target.foreach(t => asService(t) { args: js.Array[js.Any] => module.config(args) }) - this - } - - def controller(target: Controller*): this.type = { - require(target != null, "Missing argument 'target'.") - - target.foreach(t => asService(t) { args: js.Array[js.Any] => module.controller(t.name, args) }) - this - } - - def run(target: InjectionTarget*): this.type = { - require(target != null, "Missing argument 'target'.") - - target.foreach(t => asService(t) { args: js.Array[js.Any] => module.run(args) }) - this - } + import internal.{ Angular => angular } - def directive(directives: Directive*): this.type = { - require(directives != null, "Missing argument 'directives'.") + def config[A <: Config](target: A): Module = macro angular.config[A] - def registerDirective(d: Directive) { - val handler = (a0: js.Any, a1: js.Any, a2: js.Any, a3: js.Any, a4: js.Any, - a5: js.Any, a6: js.Any, a7: js.Any, a8: js.Any, a9: js.Any) => { - d.inject(Seq(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9)) - d.initialize() - d.buildConfig() - } + def controller[A <: Controller](target: A): Module = macro angular.controller[A] - val args = js.Array[js.Any]() + def directive[A <: Directive](target: A): Module = macro angular.directive[A] - d.dependencies.foreach(args.push(_)) - args.push(handler) + def factory[A <: Factory[_]](target: A): Module = macro angular.factory[A] - module.directive(d.name, args) - } + def run[A <: Runnable](target: A): Module = macro angular.run[A] - directives.foreach(registerDirective) - this - } + def service[A <: NamedService](target: A): Module = macro angular.service[A] } diff --git a/src/main/scala/com/greencatsoft/angularjs/Named.scala b/src/main/scala/com/greencatsoft/angularjs/Named.scala new file mode 100644 index 0000000..3041ae7 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Named.scala @@ -0,0 +1,6 @@ +package com.greencatsoft.angularjs + +trait Named { + + val name: String = getClass.getSimpleName +} diff --git a/src/main/scala/com/greencatsoft/angularjs/NamedTarget.scala b/src/main/scala/com/greencatsoft/angularjs/NamedTarget.scala deleted file mode 100644 index 51c8bd3..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/NamedTarget.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.greencatsoft.angularjs - -trait NamedTarget extends InjectionTarget { - - val name: String -} - -abstract class AbstractNamedTarget(_name: String) extends NamedTarget { - require(name != null, "Missing argument '_name'.") - - // use the name of the class/object if not specified explicitly - override lazy val name: String = - if (_name == null) this.getClass.getName.split("\\$").last - else _name -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/Runnable.scala b/src/main/scala/com/greencatsoft/angularjs/Runnable.scala new file mode 100644 index 0000000..d22a902 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Runnable.scala @@ -0,0 +1,3 @@ +package com.greencatsoft.angularjs + +trait Runnable extends Service with Initializable diff --git a/src/main/scala/com/greencatsoft/angularjs/Service.scala b/src/main/scala/com/greencatsoft/angularjs/Service.scala new file mode 100644 index 0000000..834113f --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Service.scala @@ -0,0 +1,5 @@ +package com.greencatsoft.angularjs + +trait Service + +trait NamedService extends Service with Named \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/Template.scala b/src/main/scala/com/greencatsoft/angularjs/Template.scala new file mode 100644 index 0000000..1c4f4e4 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Template.scala @@ -0,0 +1,12 @@ +package com.greencatsoft.angularjs + +trait Templated { + + val templateUrl: String +} + +trait TemplateSource { + + val template: String +} + diff --git a/src/main/scala/com/greencatsoft/angularjs/Titled.scala b/src/main/scala/com/greencatsoft/angularjs/Titled.scala new file mode 100644 index 0000000..ac98532 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/Titled.scala @@ -0,0 +1,6 @@ +package com.greencatsoft.angularjs + +trait Titled { + + val title: String +} diff --git a/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScroll.scala b/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScroll.scala deleted file mode 100755 index 16b1eb4..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScroll.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.greencatsoft.angularjs.anchorscroll - -import com.greencatsoft.angularjs.Injectable - -trait AnchorScroll extends Injectable { - - def apply(): Unit = ??? -} - -object AnchorScroll { - - val Name = "$anchorScroll" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScrollAware.scala b/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScrollAware.scala deleted file mode 100755 index c2e426e..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/anchorscroll/AnchorScrollAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.anchorscroll - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait AnchorScrollAware extends InjectionTarget { - - implicit var anchorScroll: AnchorScroll = _ - - override def dependencies = super.dependencies :+ AnchorScroll.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(AnchorScroll.Name) ensuring (_ >= 0) - this.anchorScroll = args(index).asInstanceOf[AnchorScroll] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/animate/AnimateAware.scala b/src/main/scala/com/greencatsoft/angularjs/animate/AnimateAware.scala deleted file mode 100755 index 03d81a1..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/animate/AnimateAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.animate - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait AnimateAware extends InjectionTarget { - - implicit var animate: Animate = _ - - override def dependencies = super.dependencies :+ Animate.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Animate.Name) ensuring (_ >= 0) - this.animate = args(index).asInstanceOf[Animate] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactory.scala b/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactory.scala deleted file mode 100755 index c61906e..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactory.scala +++ /dev/null @@ -1,14 +0,0 @@ -package com.greencatsoft.angularjs.cachefactory - -import scala.scalajs.js -import com.greencatsoft.angularjs.Injectable - -trait CacheFactory extends Injectable { - - def apply(cacheId: String, options: js.Object): Cache = ??? -} - -object CacheFactory { - - val Name = "$cacheFactory" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactoryAware.scala b/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactoryAware.scala deleted file mode 100755 index e58454c..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/cachefactory/CacheFactoryAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.cachefactory - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait CacheFactoryAware extends InjectionTarget { - - implicit var cacheFactory: CacheFactory = _ - - override def dependencies = super.dependencies :+ CacheFactory.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(CacheFactory.Name) ensuring (_ >= 0) - this.cacheFactory = args(index).asInstanceOf[CacheFactory] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/compile/CompileAware.scala b/src/main/scala/com/greencatsoft/angularjs/compile/CompileAware.scala deleted file mode 100755 index 9e5272e..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/compile/CompileAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.compile - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait CompileAware extends InjectionTarget { - - implicit var compile: Compile = _ - - override def dependencies = super.dependencies :+ Compile.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Compile.Name) ensuring (_ >= 0) - this.compile = args(index).asInstanceOf[Compile] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/controller/Controller.scala b/src/main/scala/com/greencatsoft/angularjs/controller/Controller.scala deleted file mode 100644 index a270775..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/controller/Controller.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.greencatsoft.angularjs.controller - -import com.greencatsoft.angularjs.scope.ScopeAware -import com.greencatsoft.angularjs.AbstractNamedTarget -import com.greencatsoft.angularjs.NamedTarget - -trait Controller extends NamedTarget with ScopeAware - -abstract class AbstractController(name: String) - extends AbstractNamedTarget(name) with Controller diff --git a/src/main/scala/com/greencatsoft/angularjs/controller/TemplateController.scala b/src/main/scala/com/greencatsoft/angularjs/controller/TemplateController.scala deleted file mode 100644 index a4222b3..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/controller/TemplateController.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.greencatsoft.angularjs.controller - -trait TemplateController extends Controller { - - val templateUrl: String - - val title: Option[String] = None -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/core/AnchorScroll.scala b/src/main/scala/com/greencatsoft/angularjs/core/AnchorScroll.scala new file mode 100755 index 0000000..8632efa --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/core/AnchorScroll.scala @@ -0,0 +1,11 @@ +package com.greencatsoft.angularjs.core + +import com.greencatsoft.angularjs.injectable + +import scala.scalajs.js + +@injectable("$anchorScroll") +trait AnchorScroll extends js.Object { + + def apply(): Unit = ??? +} diff --git a/src/main/scala/com/greencatsoft/angularjs/animate/Animate.scala b/src/main/scala/com/greencatsoft/angularjs/core/Animate.scala similarity index 78% rename from src/main/scala/com/greencatsoft/angularjs/animate/Animate.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Animate.scala index 359ac1b..aeaecc8 100755 --- a/src/main/scala/com/greencatsoft/angularjs/animate/Animate.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Animate.scala @@ -1,10 +1,11 @@ -package com.greencatsoft.angularjs.animate +package com.greencatsoft.angularjs.core import scala.scalajs.js -import com.greencatsoft.angularjs.Injectable +import com.greencatsoft.angularjs.injectable -trait Animate extends Injectable { +@injectable("$animate") +trait Animate extends js.Object { def enter(element: js.Object, parent: js.Object, after: js.Object, done: js.Function = null): Unit = ??? @@ -18,9 +19,3 @@ trait Animate extends Injectable { def setClass(element: js.Object, add: String, remove: String, done: js.Function = null): Unit = ??? } - -object Animate { - - val Name = "$animate" -} - diff --git a/src/main/scala/com/greencatsoft/angularjs/core/Browser.scala b/src/main/scala/com/greencatsoft/angularjs/core/Browser.scala new file mode 100644 index 0000000..05ad350 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/core/Browser.scala @@ -0,0 +1,9 @@ +package com.greencatsoft.angularjs.core + +import com.greencatsoft.angularjs.injectable + +@injectable("$document") +trait Document extends org.scalajs.dom.Document + +@injectable("$window") +trait Window extends org.scalajs.dom.Window diff --git a/src/main/scala/com/greencatsoft/angularjs/cachefactory/Cache.scala b/src/main/scala/com/greencatsoft/angularjs/core/Cache.scala similarity index 53% rename from src/main/scala/com/greencatsoft/angularjs/cachefactory/Cache.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Cache.scala index 0cbace2..41f7b9b 100755 --- a/src/main/scala/com/greencatsoft/angularjs/cachefactory/Cache.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Cache.scala @@ -1,11 +1,12 @@ -package com.greencatsoft.angularjs.cachefactory +package com.greencatsoft.angularjs.core import scala.scalajs.js import scala.scalajs.js.UndefOr -import com.greencatsoft.angularjs.Injectable +import com.greencatsoft.angularjs.injectable -trait Cache extends Injectable { +@injectable("$cache") +trait Cache extends js.Object { def info(): js.Dictionary[js.Any] = ??? @@ -19,3 +20,9 @@ trait Cache extends Injectable { def destroy(): Unit = ??? } + +@injectable("$cacheFactory") +trait CacheFactory extends js.Object { + + def apply(cacheId: String, options: js.Object): Cache = ??? +} diff --git a/src/main/scala/com/greencatsoft/angularjs/compile/Compile.scala b/src/main/scala/com/greencatsoft/angularjs/core/Compile.scala similarity index 65% rename from src/main/scala/com/greencatsoft/angularjs/compile/Compile.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Compile.scala index 7462cfb..a66d4f1 100755 --- a/src/main/scala/com/greencatsoft/angularjs/compile/Compile.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Compile.scala @@ -1,13 +1,13 @@ -package com.greencatsoft.angularjs.compile +package com.greencatsoft.angularjs.core import scala.scalajs.js import org.scalajs.dom.Element -import com.greencatsoft.angularjs.Injectable -import com.greencatsoft.angularjs.scope.Scope +import com.greencatsoft.angularjs.injectable -trait Compile extends Injectable { +@injectable("$compile") +trait Compile extends js.Object { type LinkFunction = js.Function2[Scope, CloneAttachFunction, Element] @@ -17,8 +17,3 @@ trait Compile extends Injectable { def apply(element: Element, transclude: CloneAttachFunction, maxPriority: js.Number): LinkFunction = ??? } - -object Compile { - - val Name = "$compile" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpPromise.scala b/src/main/scala/com/greencatsoft/angularjs/core/Http.scala similarity index 54% rename from src/main/scala/com/greencatsoft/angularjs/http/HttpPromise.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Http.scala index 8798ac6..1668d38 100644 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpPromise.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Http.scala @@ -1,14 +1,79 @@ -package com.greencatsoft.angularjs.http +package com.greencatsoft.angularjs.core -import scala.language.implicitConversions import scala.concurrent.{ CanAwait, ExecutionContext, Future } import scala.concurrent.duration.Duration +import scala.language.implicitConversions import scala.scalajs.js import scala.scalajs.js.{ JavaScriptException, UndefOr } import scala.scalajs.js.Any.fromFunction1 import scala.util.{ Failure, Success, Try } -import com.greencatsoft.angularjs.q.Promise +import com.greencatsoft.angularjs.injectable + +@injectable("$http") +trait HttpService extends js.Object { + + def get(url: String): HttpPromise = ??? + + def get(url: String, config: HttpConfig): HttpPromise = ??? + + def post(url: String): HttpPromise = ??? + + def post(url: String, data: js.Any): HttpPromise = ??? + + def post(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? + + def put(url: String): HttpPromise = ??? + + def put(url: String, data: js.Any): HttpPromise = ??? + + def put(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? + + def delete(url: String): HttpPromise = ??? + + def delete(url: String, data: js.Any): HttpPromise = ??? + + def delete(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? +} + +trait HttpConfig extends js.Object { + + var cache = false + + var responseType = "" + + var headers = new js.Array[js.Any] + + var transformResponse: js.Array[js.Function2[js.Any, js.Any, js.Any]] = _ + + var transformRequest: js.Array[js.Function2[js.Any, js.Any, js.Any]] = _ +} + +object HttpConfig { + + def apply() = { + val config = new js.Object().asInstanceOf[HttpConfig] + + config.transformRequest = js.Array() + config.transformResponse = js.Array() + + config + } + + def documentHandler(): HttpConfig = { + val config = apply() + + config.responseType = "document" + + config + } +} + +@injectable("$httpProvider") +trait HttpProvider extends js.Object { + + var defaults: HttpConfig +} trait HttpPromise extends Promise { @@ -35,7 +100,7 @@ trait HttpPromise extends Promise { object HttpPromise { - implicit def promise2future[T](promise: Promise): Future[T] = new HttpFuture[T](promise) + implicit def promise2future[A](promise: Promise): Future[A] = new HttpFuture[A](promise) trait HttpResult extends js.Object { @@ -48,22 +113,22 @@ object HttpPromise { val statusText: String = ??? } - class HttpFuture[T](promise: Promise) extends Future[T] { + class HttpFuture[A](promise: Promise) extends Future[A] { - type Listener[U] = Try[T] => U + type Listener[U] = Try[A] => U - private var result: Option[Try[T]] = None + private var result: Option[Try[A]] = None private var listeners: Seq[Listener[_]] = Seq.empty - private def notify(result: Try[T]): Option[Try[T]] = { + private def notify(result: Try[A]): Option[Try[A]] = { listeners.foreach(_(result)) Some(result) } promise `then` { (r: js.Any) => val httpResult = r.asInstanceOf[HttpResult] - this.result = notify(Success(httpResult.data.asInstanceOf[T])) + this.result = notify(Success(httpResult.data.asInstanceOf[A])) r } `catch` { (error: js.Any) => val httpResult = error.asInstanceOf[HttpResult] @@ -73,7 +138,7 @@ object HttpPromise { override def ready(atMost: Duration)(implicit permit: CanAwait): this.type = throw new UnsupportedOperationException - override def result(atMost: Duration)(implicit permit: CanAwait): T = + override def result(atMost: Duration)(implicit permit: CanAwait): A = throw new UnsupportedOperationException override def isCompleted: Boolean = result.isDefined @@ -81,6 +146,6 @@ object HttpPromise { override def onComplete[U](f: Listener[U])(implicit executor: ExecutionContext): Unit = listeners +:= f - override def value: Option[Try[T]] = result + override def value: Option[Try[A]] = result } } \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/location/Location.scala b/src/main/scala/com/greencatsoft/angularjs/core/Location.scala similarity index 72% rename from src/main/scala/com/greencatsoft/angularjs/location/Location.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Location.scala index 3601c98..b3e2623 100755 --- a/src/main/scala/com/greencatsoft/angularjs/location/Location.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Location.scala @@ -1,10 +1,11 @@ -package com.greencatsoft.angularjs.location +package com.greencatsoft.angularjs.core import scala.scalajs.js -import com.greencatsoft.angularjs.Injectable +import com.greencatsoft.angularjs.injectable -trait Location extends Injectable { +@injectable("$location") +trait Location extends js.Object { def absUrl(): String = ??? @@ -25,8 +26,3 @@ trait Location extends Injectable { def replace(): Unit = ??? } - -object Location { - - val Name = "$location" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/parse/Parse.scala b/src/main/scala/com/greencatsoft/angularjs/core/Parse.scala similarity index 50% rename from src/main/scala/com/greencatsoft/angularjs/parse/Parse.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Parse.scala index 96cc5f8..de6e8a9 100755 --- a/src/main/scala/com/greencatsoft/angularjs/parse/Parse.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Parse.scala @@ -1,16 +1,13 @@ -package com.greencatsoft.angularjs.parse +package com.greencatsoft.angularjs.core import scala.scalajs.js -import com.greencatsoft.angularjs.Injectable -trait Parse extends Injectable { +import com.greencatsoft.angularjs.injectable + +@injectable("$parse") +trait Parse extends js.Object { type ParsedExpression = js.Function2[js.Object, js.Object, js.Function] def apply(expression: String): ParsedExpression = ??? } - -object Parse { - - val Name = "$parse" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/q/Promise.scala b/src/main/scala/com/greencatsoft/angularjs/core/Q.scala old mode 100644 new mode 100755 similarity index 50% rename from src/main/scala/com/greencatsoft/angularjs/q/Promise.scala rename to src/main/scala/com/greencatsoft/angularjs/core/Q.scala index c9216c8..0a6fda6 --- a/src/main/scala/com/greencatsoft/angularjs/q/Promise.scala +++ b/src/main/scala/com/greencatsoft/angularjs/core/Q.scala @@ -1,5 +1,6 @@ -package com.greencatsoft.angularjs.q +package com.greencatsoft.angularjs.core +import scala.annotation.implicitNotFound import scala.concurrent.{ CanAwait, ExecutionContext, Future } import scala.concurrent.duration.Duration import scala.language.implicitConversions @@ -8,6 +9,53 @@ import scala.scalajs.js.Any.fromFunction1 import scala.scalajs.js.JavaScriptException import scala.util.{ Failure, Success, Try } +import com.greencatsoft.angularjs.injectable + +@injectable("$q") +trait Q extends js.Object { + + def defer(): Defer = ??? + + def promise(): Promise = ??? +} + +trait Defer extends js.Object { + + def resolve(value: js.Any): Unit = ??? + + def reject(reason: String): Unit = ??? + + def notify(value: js.Any): Unit = ??? + + val promise: Promise = ??? +} + +object Defer { + + implicit def defer2promise[A](defer: Defer): scala.concurrent.Promise[A] = new DeferredPromise[A](defer) + + class DeferredPromise[A](defer: Defer) extends scala.concurrent.Promise[A] { + + private var completed = false + + override def future: Future[A] = new Promise.DeferredFuture(defer.promise) + + override def isCompleted: Boolean = completed + + override def tryComplete(result: Try[A]): Boolean = if (isCompleted) false else { + result match { + case Success(r) => + defer.resolve(r.asInstanceOf[js.Any]) + case Failure(e) => + defer.reject(e.getMessage()) + } + + this.completed = true + completed + } + } +} + trait Promise extends js.Object { def `then`(successCallback: js.Function1[js.Any, js.Any]): this.type = ??? @@ -23,23 +71,23 @@ trait Promise extends js.Object { object Promise { - implicit def promise2future[T](promise: Promise): Future[T] = new DeferredFuture[T](promise) + implicit def promise2future[A](promise: Promise): Future[A] = new DeferredFuture[A](promise) - class DeferredFuture[T](promise: Promise) extends Future[T] { + class DeferredFuture[A](promise: Promise) extends Future[A] { - type Listener[U] = Try[T] => U + type Listener[U] = Try[A] => U - private var result: Option[Try[T]] = None + private var result: Option[Try[A]] = None private var listeners: Seq[Listener[_]] = Seq.empty - private def notify(result: Try[T]): Option[Try[T]] = { + private def notify(result: Try[A]): Option[Try[A]] = { listeners.foreach(_(result)) Some(result) } promise `then` { (r: js.Any) => - this.result = notify(Success(r.asInstanceOf[T])) + this.result = notify(Success(r.asInstanceOf[A])) r } `catch` { (error: js.Any) => this.result = notify(Failure(JavaScriptException(error))) @@ -48,7 +96,7 @@ object Promise { override def ready(atMost: Duration)(implicit permit: CanAwait): this.type = throw new UnsupportedOperationException - override def result(atMost: Duration)(implicit permit: CanAwait): T = + override def result(atMost: Duration)(implicit permit: CanAwait): A = throw new UnsupportedOperationException override def isCompleted: Boolean = result.isDefined @@ -56,6 +104,6 @@ object Promise { override def onComplete[U](f: Listener[U])(implicit executor: ExecutionContext): Unit = listeners +:= f - override def value: Option[Try[T]] = result + override def value: Option[Try[A]] = result } } \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/core/Route.scala b/src/main/scala/com/greencatsoft/angularjs/core/Route.scala new file mode 100644 index 0000000..7f4b4d0 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/core/Route.scala @@ -0,0 +1,79 @@ +package com.greencatsoft.angularjs.core + +import scala.scalajs.js +import scala.scalajs.js.UndefOr +import scala.scalajs.js.UndefOr.any2undefOrA + +import com.greencatsoft.angularjs.{ PageController, TitledPageController, injectable } + +@injectable("$routeProvider") +trait RouteProvider extends js.Object { + + def when(path: String, route: Route): this.type = ??? + + def otherwise(route: Route): this.type = ??? +} + +trait Route extends js.Object { + + var title: UndefOr[String] = ??? + + var templateUrl: UndefOr[String] = ??? + + var controller: UndefOr[String] = ??? + + var redirectTo: UndefOr[String] = ??? +} + +object Route { + + def apply(templateUrl: String, title: String = null): Route = { + require(templateUrl != null, "Missing argument 'templateUrl'.") + require(title != null, "Missing argument 'title'.") + + var route = new js.Object().asInstanceOf[Route] + + Option(title).foreach(route.title = _) + + route.templateUrl = templateUrl + route + } + + def apply(controller: PageController): Route = { + require(controller != null, "Missing argument 'controller'.") + + var route = new js.Object().asInstanceOf[Route] + + route.templateUrl = controller.templateUrl + route.controller = controller.name + + controller match { + case titled: TitledPageController => route.title = titled.title + case _ => + } + + route + } + + def redirectTo(url: String): Route = { + require(url != null, "Missing argument 'url'.") + + var route = new js.Object().asInstanceOf[Route] + + route.redirectTo = url + route + } +} + +trait RouteInfo extends js.Object { + + var $$route: Route = ??? + + var loadedTemplateUrl: String = ??? + + var params: js.Array[js.Any] = ??? + + var pathParams: js.Array[js.Any] = ??? + + var scope: Scope = ??? +} diff --git a/src/main/scala/com/greencatsoft/angularjs/core/Scope.scala b/src/main/scala/com/greencatsoft/angularjs/core/Scope.scala new file mode 100755 index 0000000..5c6f38d --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/core/Scope.scala @@ -0,0 +1,83 @@ +package com.greencatsoft.angularjs.core + +import scala.scalajs.js + +import com.greencatsoft.angularjs.{ Initializable, Service, inject, injectable } + +@injectable("$scope") +trait Scope extends js.Object { + + def $id: String = ??? + + def $apply(exp: js.Any = null): js.Any = ??? + + def $broadcast(name: String, args: js.Any*): js.Object = ??? + + def $destroy(): Unit = ??? + + def $digest(): Unit = ??? + + def $emit(name: String, args: js.Any*): js.Object = ??? + + def $eval(expression: js.Any = null, locals: js.Object = null): js.Any = ??? + + def $evalAsync(expression: js.Any = null): Unit = ??? + + def $new(isolate: Boolean): Scope = ??? + + def $on(name: String, listener: js.Function): js.Any = ??? + + def $watch(watchExpression: js.Any, listener: js.Any = null, objectEquality: Boolean = false): js.Function = ??? + + def $watchCollection(obj: js.Any, listener: js.Function): js.Function = ??? +} + +trait Scoped { + this: Service => + + type ScopeType <: Scope + + implicit class DynamicScope(scope: ScopeType) { + + def dynamic = scope.asInstanceOf[js.Dynamic] + } +} + +trait ScopeAware extends Initializable with Scoped { + this: Service => + + @inject + var rawScope: Scope = _ + + implicit var scope: ScopeType = _ + + abstract override def initialize() { + this.scope = rawScope.asInstanceOf[ScopeType] + + super.initialize() + + initialize(scope) + } + + def initialize(scope: ScopeType): Unit = Unit +} + +@injectable("$rootScope") +trait RootScope extends Scope + +trait RootScopeAware extends Initializable with Scoped { + this: Service => + + @inject + var rawRootScope: RootScope = _ + + implicit var rootScope: ScopeType = _ + + override type ScopeType <: RootScope + + abstract override def initialize() { + this.rootScope = rawRootScope.asInstanceOf[ScopeType] + + super.initialize() + } +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/core/Timer.scala b/src/main/scala/com/greencatsoft/angularjs/core/Timer.scala new file mode 100644 index 0000000..47f92c2 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/core/Timer.scala @@ -0,0 +1,21 @@ +package com.greencatsoft.angularjs.core + +import scala.scalajs.js + +import com.greencatsoft.angularjs.injectable + +@injectable("$interval") +trait Interval extends js.Object { + + def apply(fn: js.Function0[_], delay: Int = 0, invokeApply: Boolean = true): Promise = ??? + + def cancel(promise: Promise = null): Boolean = ??? +} + +@injectable("$timeout") +trait Timeout extends js.Object { + + def apply(fn: js.Function0[_], delay: Int = 0, invokeApply: Boolean = true): Promise = ??? + + def cancel(promise: Promise = null): Boolean = ??? +} diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/Attributes.scala b/src/main/scala/com/greencatsoft/angularjs/directive/Attributes.scala deleted file mode 100644 index d667945..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/Attributes.scala +++ /dev/null @@ -1,28 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.scalajs.js -import scala.scalajs.js.UndefOr -import scala.scalajs.js.annotation.JSBracketAccess - -trait Attributes extends js.Object { - - val $attr: js.Dictionary[String] = ??? - - def $addClass(classVal: String): Unit = ??? - - def $removeClass(classVal: String): Unit = ??? - - def $updateClass(newClasses: String, oldClasses: String): Unit = ??? - - @JSBracketAccess - def apply(name: String): UndefOr[String] = ??? - - @JSBracketAccess - def update(name: String, value: String): Unit = ??? - - def $get(name: String): UndefOr[String] = ??? - - def $set(name: String, value: String): Unit = ??? - - def $observe(key: String, fn: js.Function1[String, Unit]): Unit = ??? -} diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/Directive.scala b/src/main/scala/com/greencatsoft/angularjs/directive/Directive.scala deleted file mode 100755 index fe733f9..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/Directive.scala +++ /dev/null @@ -1,49 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.scalajs.js -import scala.scalajs.js.Any.{fromFunction4, wrapArray} -import scala.scalajs.js.UndefOr -import scala.scalajs.js.UndefOr.undefOr2ops - -import org.scalajs.dom.Element - -import com.greencatsoft.angularjs.{ConfigBuilder, Module, NamedTarget} -import com.greencatsoft.angularjs.controller.Controller -import com.greencatsoft.angularjs.scope.Scoped - -trait Directive extends NamedTarget with Scoped with ConfigBuilder { - - override def initialize(): Unit = Unit - - val controller: Option[Controller] = None - - override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - def bind(scope: ScopeType): ScopeType = { - scope.dynamic.directive = this.asInstanceOf[js.Object] - scope - } - - config("link") = (scope: ScopeType, elems: js.Array[Element], attrs: Attributes, controllers: UndefOr[js.Any]) => { - controllers.toOption match { - case Some(arr) if js.Array.isArray(arr) => - val args = arr.asInstanceOf[js.Array[js.Any]].toSeq.map(Module.unbindTarget[Controller](_)).flatten - link(bind(scope), elems, attrs, args: _*) - case Some(c) => - Module.unbindTarget[Controller](c) match { - case Some(arg) => link(bind(scope), elems, attrs, arg) - case _ => link(bind(scope), elems, attrs) - } - case None => link(bind(scope), elems, attrs) - } - } - - controller foreach { c => - Module.asService(c) { args: js.Array[js.Any] => config("controller") = args } - } - - super.buildConfig(config) - } - - def link(scope: ScopeType, elems: Seq[Element], attrs: Attributes, controller: Controller*): Unit = Unit -} - diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/Requires.scala b/src/main/scala/com/greencatsoft/angularjs/directive/Requires.scala deleted file mode 100644 index ad07de0..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/Requires.scala +++ /dev/null @@ -1,31 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.language.implicitConversions -import scala.scalajs.js - -import com.greencatsoft.angularjs.{ ConfigBuilder, NamedTarget } - -trait Requires extends ConfigBuilder { - this: Directive => - - var requirements = Set.empty[Requirement] - - abstract override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("require") = js.Array[String](requirements.toSeq.map(_.toString): _*) - - super.buildConfig(config) - } - - case class Requirement(name: String, lookup: Boolean, optional: Boolean = false) { - - override def toString = (if (lookup) "^" else "") + (if (optional) "?" else "") + name - } - - def ^(requirement: NamedTarget) = new Requirement(requirement.name, true) - - def ^?(requirement: NamedTarget) = new Requirement(requirement.name, true, true) - - def ?(requirement: NamedTarget) = new Requirement(requirement.name, false, true) - - implicit def ~(requirement: NamedTarget) = new Requirement(requirement.name, false) -} diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/RestrictedDirective.scala b/src/main/scala/com/greencatsoft/angularjs/directive/RestrictedDirective.scala deleted file mode 100644 index c3e62c8..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/RestrictedDirective.scala +++ /dev/null @@ -1,48 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.scalajs.js -import scala.scalajs.js.Any.fromString - -import com.greencatsoft.angularjs.ConfigBuilder - -trait RestrictedDirective extends Directive with ConfigBuilder { - - def restrict: Set[String] = Set.empty - - abstract override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("restrict") = restrict.mkString - - super.buildConfig(config) - } -} - -trait ElementDirective extends RestrictedDirective { - - override def restrict = super.restrict + "E" - - var transclude = false - - var replace = false - - abstract override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("transclude") = transclude - config("replace") = replace - - super.buildConfig(config) - } -} - -trait AttributeDirective extends RestrictedDirective { - - override def restrict = super.restrict + "A" -} - -trait ClassDirective extends RestrictedDirective { - - override def restrict = super.restrict + "C" -} - -trait CommentDirective extends RestrictedDirective { - - override def restrict = super.restrict + "M" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/ScopeStrategy.scala b/src/main/scala/com/greencatsoft/angularjs/directive/ScopeStrategy.scala deleted file mode 100644 index 9b7bc8b..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/ScopeStrategy.scala +++ /dev/null @@ -1,70 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.scalajs.js -import scala.scalajs.js.Any.fromBoolean - -import com.greencatsoft.angularjs.ConfigBuilder - -trait ScopeStrategy extends ConfigBuilder { - this: Directive => -} - -trait InheritParentScope extends ScopeStrategy { - this: Directive => - - override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("scope") = true - - super.buildConfig(config) - } -} - -trait UseParentScope extends ScopeStrategy { - this: Directive => - - override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("scope") = false - - super.buildConfig(config) - } -} - -trait IsolatedScope extends ScopeStrategy { - this: Directive => - - var bindings = Seq.empty[ScopeBinding] - - override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - val dict = js.Dictionary.empty[String] - - bindings foreach { b => - dict(b.name) = s"${b.prefix}${b.attribute}" - } - - config("scope") = dict - - super.buildConfig(config) - } - - abstract class ScopeBinding(val prefix: String) { - - val name: String - - val attribute: String - } - - case class UnidirectionalBinding(name: String, attribute: String = "") extends ScopeBinding("=") - - case class BidirectionalBinding(name: String, attribute: String = "") extends ScopeBinding("@") - - case class BehavioralBinding(name: String, attribute: String = "") extends ScopeBinding("&") - - implicit class BindingBuilder(name: String) { - - def :=(attribute: String = ""): ScopeBinding = UnidirectionalBinding(name, attribute) - - def :@(attribute: String = ""): ScopeBinding = BidirectionalBinding(name, attribute) - - def :&(attribute: String = ""): ScopeBinding = BehavioralBinding(name, attribute) - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/directive/TemplateProvider.scala b/src/main/scala/com/greencatsoft/angularjs/directive/TemplateProvider.scala deleted file mode 100644 index b23c90c..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/directive/TemplateProvider.scala +++ /dev/null @@ -1,36 +0,0 @@ -package com.greencatsoft.angularjs.directive - -import scala.scalajs.js -import scala.scalajs.js.Any.fromFunction2 - -import org.scalajs.dom.Element - -import com.greencatsoft.angularjs.ConfigBuilder - -trait TemplateProvider extends ConfigBuilder { - this: Directive => - - val template: String - - def getTemplate(elems: Seq[Element], attrs: Attributes): String = template - - abstract override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("template") = (elems: js.Array[Element], attrs: Attributes) => getTemplate(elems, attrs) - - super.buildConfig(config) - } -} - -trait TemplateUrlProvider extends ConfigBuilder { - this: Directive => - - val templateUrl: String - - def getTemplateUrl(elems: Seq[Element], attrs: Attributes): String = templateUrl - - abstract override def buildConfig(config: js.Dictionary[js.Any]): js.Dictionary[js.Any] = { - config("templateUrl") = (elems: js.Array[Element], attrs: Attributes) => getTemplateUrl(elems, attrs) - - super.buildConfig(config) - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/dom/Document.scala b/src/main/scala/com/greencatsoft/angularjs/dom/Document.scala deleted file mode 100755 index 9395c92..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/dom/Document.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.greencatsoft.angularjs.dom - -import com.greencatsoft.angularjs.Injectable - -trait Document extends org.scalajs.dom.Document with Injectable - -object Document extends Injectable { - - val Name = "$document" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/dom/DocumentAware.scala b/src/main/scala/com/greencatsoft/angularjs/dom/DocumentAware.scala deleted file mode 100755 index 1461b11..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/dom/DocumentAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.dom - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait DocumentAware extends InjectionTarget { - - implicit var document: org.scalajs.dom.Document = _ - - override def dependencies = super.dependencies :+ Document.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Document.Name) ensuring (_ >= 0) - this.document = args(index).asInstanceOf[Document] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/dom/Window.scala b/src/main/scala/com/greencatsoft/angularjs/dom/Window.scala deleted file mode 100755 index d4a42eb..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/dom/Window.scala +++ /dev/null @@ -1,10 +0,0 @@ -package com.greencatsoft.angularjs.dom - -import com.greencatsoft.angularjs.Injectable - -trait Window extends org.scalajs.dom.Window with Injectable - -object Window { - - val Name = "$window" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/dom/WindowAware.scala b/src/main/scala/com/greencatsoft/angularjs/dom/WindowAware.scala deleted file mode 100755 index becb23f..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/dom/WindowAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.dom - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait WindowAware extends InjectionTarget { - - implicit var window: org.scalajs.dom.Window = _ - - override def dependencies = super.dependencies :+ Window.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Window.Name) ensuring (_ >= 0) - this.window = args(index).asInstanceOf[Window] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/extensions/FileUpload.scala b/src/main/scala/com/greencatsoft/angularjs/extensions/FileUpload.scala new file mode 100644 index 0000000..502633b --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/extensions/FileUpload.scala @@ -0,0 +1,65 @@ +package com.greencatsoft.angularjs.extensions + +import scala.scalajs.js + +import org.scalajs.dom.File + +import com.greencatsoft.angularjs.core.HttpPromise +import com.greencatsoft.angularjs.injectable + +/** + * Wrapper for the angular-file-upload module. + * + * @see https://github.com/danialfarid/angular-file-upload + */ +@injectable("$upload") +trait FileUpload extends js.Object { + + def upload(config: FileUploadConfig): FileUploadPromise = ??? +} + +trait FileUploadConfig extends js.Object { + + var url: String = _ + + var data: Any = _ + + var file: File = _ + + var method: String = _ + + var fileName: js.Any = _ + + var fileFormDataName: js.Any = _ +} + +object FileUploadConfig { + + def apply(url: String, file: File, data: Option[Any] = None) = { + require(url != null, "Missing argument 'url'.") + require(file != null, "Missing argument 'file'.") + + val config = new js.Object().asInstanceOf[FileUploadConfig] + + config.url = url + config.file = file + + data.foreach(config.data = _) + + config + } +} + +trait FileUploadPromise extends HttpPromise { + + def progress(listener: js.Function1[ProgressEvent, Unit]): this.type = ??? + + def abort(): Unit = ??? +} + +class ProgressEvent extends js.Object { + + val loaded: Double = ??? + + val total: Double = ??? +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/i18next/NamespaceConfig.scala b/src/main/scala/com/greencatsoft/angularjs/extensions/I18next.scala similarity index 52% rename from src/main/scala/com/greencatsoft/angularjs/i18next/NamespaceConfig.scala rename to src/main/scala/com/greencatsoft/angularjs/extensions/I18next.scala index a9125f8..56a7029 100644 --- a/src/main/scala/com/greencatsoft/angularjs/i18next/NamespaceConfig.scala +++ b/src/main/scala/com/greencatsoft/angularjs/extensions/I18next.scala @@ -1,8 +1,42 @@ -package com.greencatsoft.angularjs.i18next +package com.greencatsoft.angularjs.extensions import scala.scalajs.js import scala.scalajs.js.JSConverters.array2JSRichGenTrav +import com.greencatsoft.angularjs.injectable + +/** + * Wrapper for the ng-i18next module + * + * @see https://github.com/archer96/ng-i18next + */ +@injectable("jm.i18next") +trait I18next extends js.Object + +@injectable("$i18nextProvider") +trait I18nextProvider extends js.Object { + var options: I18nextOptions = ??? +} + +trait I18nextOptions extends js.Object { + + var lng: String = ??? + + var detectLngQS: String = ??? + + var cookieName: String = ??? + + var cookieDomain: String = ??? + + var useCookie: Boolean = ??? + + var ns: NamespaceConfig = ??? + + var fallbackLng: String = ??? + + var resGetPath: String = ??? +} + trait NamespaceConfig extends js.Object { var namespaces: js.Array[String] = ??? diff --git a/src/main/scala/com/greencatsoft/angularjs/extensions/Modal.scala b/src/main/scala/com/greencatsoft/angularjs/extensions/Modal.scala new file mode 100644 index 0000000..b00c5fa --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/extensions/Modal.scala @@ -0,0 +1,59 @@ +package com.greencatsoft.angularjs.extensions + +import scala.scalajs.js + +import com.greencatsoft.angularjs.injectable +import com.greencatsoft.angularjs.core.Promise + +/** + * Wrapper for the modal service provided by Angular directives for Bootstrap. + * + * @see http://angular-ui.github.io/bootstrap/#/modal + */ +@injectable("$modal") +trait ModalService extends js.Object { + + def open(options: ModalOptions): ModalInstance = ??? +} + +trait ModalOptions extends js.Object { + + var templateUrl: String = _ + + var controller: String = _ + + var scope: Any = _ + + var size: String = _ + + var windowClass: String = _ + + var backdrop = true + + var keyboard = true +} + +object ModalOptions { + + def apply() = { + val options = new js.Object().asInstanceOf[ModalOptions] + + options.size = "lg" + + options + } +} + +@injectable("$modalInstance") +trait ModalInstance extends js.Object { + + def close(result: js.Any): Unit = ??? + + def close(): Unit = ??? + + def dismiss(reason: js.Any): Unit = ??? + + def result: Promise = ??? + + def opened: Promise = ??? +} diff --git a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUpload.scala b/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUpload.scala deleted file mode 100644 index e8582ff..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUpload.scala +++ /dev/null @@ -1,20 +0,0 @@ -package com.greencatsoft.angularjs.fileupload - -import scala.scalajs.js - -import com.greencatsoft.angularjs.http.HttpConfig - -/** - * Wrapper for the angular-file-upload module. - * - * @see https://github.com/danialfarid/angular-file-upload - */ -trait FileUpload extends js.Object { - - def upload(config: FileUploadConfig): FileUploadPromise = ??? -} - -object FileUpload { - - val Name = "$upload" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadAware.scala b/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadAware.scala deleted file mode 100644 index f96075a..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.fileupload - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait FileUploadAware extends InjectionTarget { - - implicit var upload: FileUpload = _ - - override def dependencies = super.dependencies :+ FileUpload.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(FileUpload.Name) ensuring (_ >= 0) - this.upload = args(index).asInstanceOf[FileUpload] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadConfig.scala b/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadConfig.scala deleted file mode 100644 index 42c64d6..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadConfig.scala +++ /dev/null @@ -1,37 +0,0 @@ -package com.greencatsoft.angularjs.fileupload - -import scala.scalajs.js - -import org.scalajs.dom.File - -trait FileUploadConfig extends js.Object { - - var url: String = _ - - var data: Any = _ - - var file: File = _ - - var method: String = _ - - var fileName: js.Any = _ - - var fileFormDataName: js.Any = _ -} - -object FileUploadConfig { - - def apply(url: String, file: File, data: Option[Any] = None) = { - require(url != null, "Missing argument 'url'.") - require(file != null, "Missing argument 'file'.") - - val config = new js.Object().asInstanceOf[FileUploadConfig] - - config.url = url - config.file = file - - data.foreach(config.data = _) - - config - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadPromise.scala b/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadPromise.scala deleted file mode 100644 index 11c63e0..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/fileupload/FileUploadPromise.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.fileupload - -import scala.scalajs.js - -import com.greencatsoft.angularjs.http.HttpPromise - -trait FileUploadPromise extends HttpPromise { - - def progress(listener: js.Function1[ProgressEvent, Unit]): this.type = ??? - - def abort(): Unit = ??? -} - -class ProgressEvent extends js.Object { - - val loaded: Double = ??? - - val total: Double = ??? -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpConfig.scala b/src/main/scala/com/greencatsoft/angularjs/http/HttpConfig.scala deleted file mode 100644 index bd90695..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpConfig.scala +++ /dev/null @@ -1,36 +0,0 @@ -package com.greencatsoft.angularjs.http - -import scala.scalajs.js - -trait HttpConfig extends js.Object { - - var cache = false - - var responseType = "" - - var headers = new js.Array[js.Any] - - var transformResponse: js.Array[js.Function2[js.Any, js.Any, js.Any]] = _ - - var transformRequest: js.Array[js.Function2[js.Any, js.Any, js.Any]] = _ -} - -object HttpConfig { - - def apply() = { - val config = new js.Object().asInstanceOf[HttpConfig] - - config.transformRequest = js.Array() - config.transformResponse = js.Array() - - config - } - - def documentHandler(): HttpConfig = { - val config = apply() - - config.responseType = "document" - - config - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpProvider.scala b/src/main/scala/com/greencatsoft/angularjs/http/HttpProvider.scala deleted file mode 100644 index f1c9d28..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpProvider.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.greencatsoft.angularjs.http - -import scala.scalajs.js - -trait HttpProvider extends js.Object { - - var defaults: HttpConfig -} - -object HttpProvider { - - val Name = "$httpProvider" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpProviderAware.scala b/src/main/scala/com/greencatsoft/angularjs/http/HttpProviderAware.scala deleted file mode 100644 index 70e610b..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpProviderAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.http - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait HttpProviderAware extends InjectionTarget { - - implicit var httpProvider: HttpProvider = _ - - override def dependencies = super.dependencies :+ HttpProvider.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(HttpProvider.Name) ensuring (_ >= 0) - this.httpProvider = args(index).asInstanceOf[HttpProvider] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpService.scala b/src/main/scala/com/greencatsoft/angularjs/http/HttpService.scala deleted file mode 100644 index 3be5c5a..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpService.scala +++ /dev/null @@ -1,33 +0,0 @@ -package com.greencatsoft.angularjs.http - -import scala.scalajs.js - -trait HttpService extends js.Object { - - def get(url: String): HttpPromise = ??? - - def get(url: String, config: HttpConfig): HttpPromise = ??? - - def post(url: String): HttpPromise = ??? - - def post(url: String, data: js.Any): HttpPromise = ??? - - def post(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? - - def put(url: String): HttpPromise = ??? - - def put(url: String, data: js.Any): HttpPromise = ??? - - def put(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? - - def delete(url: String): HttpPromise = ??? - - def delete(url: String, data: js.Any): HttpPromise = ??? - - def delete(url: String, data: js.Any, config: HttpConfig): HttpPromise = ??? -} - -object HttpService { - - val Name = "$http" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/http/HttpServiceAware.scala b/src/main/scala/com/greencatsoft/angularjs/http/HttpServiceAware.scala deleted file mode 100644 index 565aab4..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/http/HttpServiceAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.http - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait HttpServiceAware extends InjectionTarget { - - implicit var http: HttpService = _ - - override def dependencies = super.dependencies :+ HttpService.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(HttpService.Name) ensuring (_ >= 0) - this.http = args(index).asInstanceOf[HttpService] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/i18next/I18next.scala b/src/main/scala/com/greencatsoft/angularjs/i18next/I18next.scala deleted file mode 100644 index 9f8146b..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/i18next/I18next.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.greencatsoft.angularjs.i18next - -import scala.scalajs.js - -/** - * Wrapper for the ng-i18next module - * - * @see https://github.com/archer96/ng-i18next - */ -trait I18next extends js.Object { - - -} - -object I18next { - - val Name = "jm.i18next" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextOptions.scala b/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextOptions.scala deleted file mode 100644 index fe1b177..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextOptions.scala +++ /dev/null @@ -1,22 +0,0 @@ -package com.greencatsoft.angularjs.i18next - -import scala.scalajs.js - -trait I18nextOptions extends js.Object { - - var lng: String = ??? - - var detectLngQS: String = ??? - - var cookieName: String = ??? - - var cookieDomain: String = ??? - - var useCookie: Boolean = ??? - - var ns: NamespaceConfig = ??? - - var fallbackLng: String = ??? - - var resGetPath: String = ??? -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProvider.scala b/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProvider.scala deleted file mode 100644 index 409cd30..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProvider.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.greencatsoft.angularjs.i18next - -import scala.scalajs.js - -trait I18nextProvider extends js.Object { - - var options: I18nextOptions = ??? -} - -object I18nextProvider { - - val Name = "$i18nextProvider" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProviderAware.scala b/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProviderAware.scala deleted file mode 100644 index 929f8c4..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/i18next/I18nextProviderAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.i18next - -import com.greencatsoft.angularjs.InjectionTarget - -import scala.scalajs.js - -trait I18nextProviderAware extends InjectionTarget { - - var provider: I18nextProvider = _ - - override def dependencies = super.dependencies :+ I18nextProvider.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(I18nextProvider.Name) ensuring (_ >= 0) - this.provider = args(index).asInstanceOf[I18nextProvider] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/internal/Angular.scala b/src/main/scala/com/greencatsoft/angularjs/internal/Angular.scala new file mode 100644 index 0000000..22c2e76 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/internal/Angular.scala @@ -0,0 +1,78 @@ +package com.greencatsoft.angularjs.internal + +import scala.reflect.macros.blackbox.Context +import scala.scalajs.js +import scala.scalajs.js.UndefOr + +import org.scalajs.dom.Element + +import com.greencatsoft.{ angularjs => api } +import com.greencatsoft.angularjs.{ AngularElement, Config, Controller, Directive, Factory, NamedService, Runnable } + +import ServiceProxy.newInstance + +private[angularjs] trait Angular extends js.Object { + + def module(name: String): UndefOr[Module] = ??? + + def module(name: String, require: js.Array[String]): Module = ??? + + def element(elem: Element): AngularElement = ??? +} + +private[angularjs] object Angular { + + import ServiceProxy.newInstance + + def config[A <: Config](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.config($proxy); ${c.prefix.tree}}") + } + + def controller[A <: Controller](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + val name = Select(target.tree, TermName("name")) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.controller($name, $proxy); ${c.prefix.tree}}") + } + + def directive[A <: Directive](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + val name = Select(target.tree, TermName("name")) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.directive($name, $proxy); ${c.prefix.tree}}") + } + + def factory[A <: Factory[_]](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + val name = Select(target.tree, TermName("name")) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.factory($name, $proxy); ${c.prefix.tree}}") + } + + def run[A <: Runnable](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.run($proxy); ${c.prefix.tree}}") + } + + def service[A <: NamedService](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[api.Module] = { + import c.universe._ + + val proxy = newInstance(c)(target) + val name = Select(target.tree, TermName("name")) + + c.Expr[api.Module](q"{${c.prefix.tree}.module.service($name, $proxy); ${c.prefix.tree}}") + } +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/internal/ConfigBuilder.scala b/src/main/scala/com/greencatsoft/angularjs/internal/ConfigBuilder.scala new file mode 100644 index 0000000..aece36e --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/internal/ConfigBuilder.scala @@ -0,0 +1,8 @@ +package com.greencatsoft.angularjs.internal + +import scala.scalajs.js + +private[angularjs] trait ConfigBuilder { + + def buildConfig(config: Configuration = js.Dictionary.empty): Configuration = config +} diff --git a/src/main/scala/com/greencatsoft/angularjs/internal/Module.scala b/src/main/scala/com/greencatsoft/angularjs/internal/Module.scala new file mode 100644 index 0000000..5febba5 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/internal/Module.scala @@ -0,0 +1,16 @@ +package com.greencatsoft.angularjs.internal + +import scala.scalajs.js + +private[angularjs] trait Module extends js.Object { + + def factory(name: String, constructor: js.Array[js.Any]): Module = ??? + + def controller(name: String, constructor: js.Array[js.Any]): Module = ??? + + def config(constructor: js.Array[js.Any]): Module = ??? + + def run(constructor: js.Array[js.Any]): Module = ??? + + def directive(name: String, directiveFactory: js.Array[js.Any]): Module = ??? +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/internal/ServiceProxy.scala b/src/main/scala/com/greencatsoft/angularjs/internal/ServiceProxy.scala new file mode 100644 index 0000000..5bdf4f1 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/internal/ServiceProxy.scala @@ -0,0 +1,115 @@ +package com.greencatsoft.angularjs.internal + +import scala.reflect.macros.blackbox.Context +import scala.scalajs.js +import scala.scalajs.js.Any.fromString +import scala.scalajs.js.UndefOr +import scala.scalajs.js.UndefOr.{ any2undefOrA, undefOr2ops } + +import com.greencatsoft.angularjs.{ Service, inject, injectable } + +object ServiceProxy { + + def bind(service: js.Any, target: Service) { + try { + service.asInstanceOf[js.Dynamic]._ng_service_proxy = target.asInstanceOf[js.Object] + } catch { + case _: Throwable => + } + } + + def unbind[A <: Service](service: js.Any): Option[A] = { + val target: UndefOr[Any] = service.asInstanceOf[js.Dynamic]._ng_service_proxy + target.map(_.asInstanceOf[A]).toOption + } + + def dependencies[A <: Service](c: Context)(implicit tag: c.WeakTypeTag[A]): Iterable[(String, c.universe.TypeSymbol, c.universe.MethodSymbol)] = { + import c.universe._ + +// Should check if @inject annotation is present: +// +// val members = tag.tpe.members filter { +// _.annotations.exists(_.tree.tpe =:= typeOf[inject]) +// } collect { +// case m: MethodSymbol if m.isSetter => m +// } + + val members = tag.tpe.members collect { case m: MethodSymbol if m.isSetter => m } + + val names = members map { member => + val argType = member.paramLists.head.head.typeSignature.dealias.typeSymbol + + val normalizedType = Option(argType.typeSignature) collect { + case ClassInfoType(_, _, sym) => sym.asType + } + + val annotations = normalizedType.map(_.annotations).toSeq.flatten.filter(_.tree.tpe =:= typeOf[injectable]) + + val members = normalizedType map { n => + n.annotations.filter(_.tree.tpe =:= typeOf[injectable]).map(_.tree.children.tail) collect { + case List(Literal(Constant(literal: String))) => (literal, n.asType, member) + } + } + + members.toSeq.flatten + } + + names.toSeq.flatten + } + + def newInstance[A <: Service](c: Context)(target: c.Expr[A])(implicit tag: c.WeakTypeTag[A]): c.Expr[js.Any] = { + import c.universe._ + + val names = dependencies[A](c) collect { + case (name, _, _) => name + } + + val assignments = dependencies[A](c).zipWithIndex collect { + case ((_, argType, setter), index) => + val argument = List(Ident(TermName(s"a$index"))) + val value = TypeApply( + Select(q"..$argument", TermName("asInstanceOf")), + List(Ident(c.mirror.staticClass(argType.fullName)))) + + Apply(Select(target.tree, setter.asTerm), List(value)) + } + + val proxy = q"""{ + import scala.scalajs.js + import scala.scalajs.js.UndefOr + import scala.scalajs.js.JSConverters.JSRichOption + + import com.greencatsoft.angularjs.{ Initializable, Service } + import com.greencatsoft.angularjs.internal.ServiceProxy + + val target: Service = $target + + val handler: js.ThisFunction10[js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, js.Any, UndefOr[js.Any]] = + (t: js.Any, a0: js.Any, a1: js.Any, a2: js.Any, a3: js.Any, a4: js.Any, a5: js.Any, a6: js.Any, a7: js.Any, a8: js.Any, a9: js.Any) => { + + ServiceProxy.bind(t, target) + + ..$assignments + + target match { + case init: Initializable => init.initialize() + case _ => + } + + val result = target match { + case configurable: Function0[_] => configurable() + case _ => null + } + + Option(result).map(_.asInstanceOf[js.Any]).orUndefined + } + + val proxy = js.Array[js.Any](..$names) + + proxy.push(handler) + proxy + }""" + + c.Expr[js.Any](proxy) + } +} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/internal/package.scala b/src/main/scala/com/greencatsoft/angularjs/internal/package.scala new file mode 100644 index 0000000..4776793 --- /dev/null +++ b/src/main/scala/com/greencatsoft/angularjs/internal/package.scala @@ -0,0 +1,11 @@ +package com.greencatsoft.angularjs + +import scala.scalajs.js +import scala.scalajs.js.{ GlobalScope, UndefOr } + +package object internal extends GlobalScope { + + private[angularjs] val angular: Angular = ??? + + type Configuration = js.Dictionary[js.Any] +} diff --git a/src/main/scala/com/greencatsoft/angularjs/location/LocationAware.scala b/src/main/scala/com/greencatsoft/angularjs/location/LocationAware.scala deleted file mode 100644 index f3c6d66..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/location/LocationAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.location - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait LocationAware extends InjectionTarget { - - implicit var location: Location = _ - - override def dependencies = super.dependencies :+ Location.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Location.Name) ensuring (_ >= 0) - this.location = args(index).asInstanceOf[Location] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstance.scala b/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstance.scala deleted file mode 100644 index 4c89140..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstance.scala +++ /dev/null @@ -1,23 +0,0 @@ -package com.greencatsoft.angularjs.modal - -import scala.scalajs.js - -import com.greencatsoft.angularjs.q.Promise - -trait ModalInstance extends js.Object { - - def close(result: js.Any): Unit = ??? - - def close(): Unit = ??? - - def dismiss(reason: js.Any): Unit = ??? - - def result: Promise = ??? - - def opened: Promise = ??? -} - -object ModalInstance { - - val Name = "$modalInstance" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstanceAware.scala b/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstanceAware.scala deleted file mode 100644 index 292b9f6..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/modal/ModalInstanceAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.modal - -import com.greencatsoft.angularjs.InjectionTarget - -import scala.scalajs.js - -trait ModalInstanceAware extends InjectionTarget { - - var modalInstance: ModalInstance = _ - - override def dependencies = super.dependencies :+ ModalInstance.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - val index = dependencies.indexOf(ModalInstance.Name) ensuring (_ >= 0) - this.modalInstance = args(index).asInstanceOf[ModalInstance] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/modal/ModalOptions.scala b/src/main/scala/com/greencatsoft/angularjs/modal/ModalOptions.scala deleted file mode 100644 index 048a445..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/modal/ModalOptions.scala +++ /dev/null @@ -1,31 +0,0 @@ -package com.greencatsoft.angularjs.modal - -import scala.scalajs.js - -trait ModalOptions extends js.Object { - - var templateUrl: String = _ - - var controller: String = _ - - var scope: Any = _ - - var size: String = _ - - var windowClass: String = _ - - var backdrop = true - - var keyboard = true -} - -object ModalOptions { - - def apply() = { - val options = new js.Object().asInstanceOf[ModalOptions] - - options.size = "lg" - - options - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/modal/ModalService.scala b/src/main/scala/com/greencatsoft/angularjs/modal/ModalService.scala deleted file mode 100644 index 639a88c..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/modal/ModalService.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.greencatsoft.angularjs.modal - -import scala.scalajs.js - -trait ModalService extends js.Object { - - def open(options: ModalOptions): ModalInstance = ??? -} - -object ModalService { - - val Name = "$modal" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/modal/ModalServiceAware.scala b/src/main/scala/com/greencatsoft/angularjs/modal/ModalServiceAware.scala deleted file mode 100644 index 0fbf5b8..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/modal/ModalServiceAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.modal - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait ModalServiceAware extends InjectionTarget { - - implicit var modal: ModalService = _ - - override def dependencies = super.dependencies :+ ModalService.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(ModalService.Name) ensuring (_ >= 0) - this.modal = args(index).asInstanceOf[ModalService] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/package.scala b/src/main/scala/com/greencatsoft/angularjs/package.scala deleted file mode 100644 index 0cfb8ce..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/package.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.greencatsoft - -import scala.scalajs.js.GlobalScope - -package object angularjs extends GlobalScope { - - val angular: Angular = ??? -} diff --git a/src/main/scala/com/greencatsoft/angularjs/parse/ParseAware.scala b/src/main/scala/com/greencatsoft/angularjs/parse/ParseAware.scala deleted file mode 100755 index 25c4123..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/parse/ParseAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.parse - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait ParseAware extends InjectionTarget { - - implicit var parse: Parse = _ - - override def dependencies = super.dependencies :+ Parse.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Parse.Name) ensuring (_ >= 0) - this.parse = args(index).asInstanceOf[Parse] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/q/Defer.scala b/src/main/scala/com/greencatsoft/angularjs/q/Defer.scala deleted file mode 100755 index b46b505..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/q/Defer.scala +++ /dev/null @@ -1,44 +0,0 @@ -package com.greencatsoft.angularjs.q - -import scala.concurrent.Future -import scala.language.implicitConversions -import scala.scalajs.js -import scala.util.{ Failure, Success, Try } -import scala.language.implicitConversions - -trait Defer extends js.Object { - - def resolve(value: js.Any): Unit = ??? - - def reject(reason: String): Unit = ??? - - def notify(value: js.Any): Unit = ??? - - val promise: Promise = ??? -} - -object Defer { - - implicit def defer2promise[T](defer: Defer): scala.concurrent.Promise[T] = new DeferredPromise[T](defer) - - class DeferredPromise[T](defer: Defer) extends scala.concurrent.Promise[T] { - - private var completed = false - - override def future: Future[T] = new Promise.DeferredFuture(defer.promise) - - override def isCompleted: Boolean = completed - - override def tryComplete(result: Try[T]): Boolean = if (isCompleted) false else { - result match { - case Success(r) => - defer.resolve(r.asInstanceOf[js.Any]) - case Failure(e) => - defer.reject(e.getMessage()) - } - - this.completed = true - completed - } - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/q/Q.scala b/src/main/scala/com/greencatsoft/angularjs/q/Q.scala deleted file mode 100755 index e12d4dc..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/q/Q.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.greencatsoft.angularjs.q - -import scala.scalajs.js - -trait Q extends js.Object { - - def defer(): Defer = ??? - - def promise(): Promise = ??? -} - -object Q { - - val Name = "$q" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/q/QAware.scala b/src/main/scala/com/greencatsoft/angularjs/q/QAware.scala deleted file mode 100644 index d61c10e..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/q/QAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.q - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait QAware extends InjectionTarget { - - var q: Q = _ - - override def dependencies = super.dependencies :+ Q.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Q.Name) ensuring (_ >= 0) - this.q = args(index).asInstanceOf[Q] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/route/Route.scala b/src/main/scala/com/greencatsoft/angularjs/route/Route.scala deleted file mode 100644 index 9bdeb04..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/route/Route.scala +++ /dev/null @@ -1,51 +0,0 @@ -package com.greencatsoft.angularjs.route - -import scala.scalajs.js -import scala.scalajs.js.UndefOr -import scala.scalajs.js.UndefOr.any2undefOrA - -import com.greencatsoft.angularjs.NamedTarget -import com.greencatsoft.angularjs.controller.TemplateController - -trait Route extends js.Object { - - var title: UndefOr[String] - - var templateUrl: UndefOr[String] - - var controller: UndefOr[String] - - var redirectTo: UndefOr[String] -} - -object Route { - - def apply(controller: TemplateController): Route = { - require(controller != null, "Missing argument 'controller'.") - apply(controller.templateUrl, controller.title, Some(controller)) - } - - def apply(templateUrl: String, title: Option[String], controller: Option[NamedTarget]): Route = { - require(templateUrl != null, "Missing argument 'templateUrl'.") - require(title != null, "Missing argument 'title'.") - require(controller != null, "Missing argument 'controller'.") - - var route = new js.Object().asInstanceOf[Route] - - route.templateUrl = templateUrl - - title.foreach(t => route.title = t) - controller.foreach(c => route.controller = c.name) - - route - } - - def apply(redirectTo: String) = { - require(redirectTo != null, "Missing argument 'redirectTo'.") - - var route = new js.Object().asInstanceOf[Route] - route.redirectTo = redirectTo - - route - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/route/RouteInfo.scala b/src/main/scala/com/greencatsoft/angularjs/route/RouteInfo.scala deleted file mode 100644 index f20f21b..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/route/RouteInfo.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.greencatsoft.angularjs.route - -import scala.scalajs.js - -import com.greencatsoft.angularjs.scope.Scope - -trait RouteInfo extends js.Object { - - var $$route: Route - - var loadedTemplateUrl: String - - var params: js.Array[js.Any] - - var pathParams: js.Array[js.Any] - - var scope: Scope -} diff --git a/src/main/scala/com/greencatsoft/angularjs/route/RouteProvider.scala b/src/main/scala/com/greencatsoft/angularjs/route/RouteProvider.scala deleted file mode 100644 index d674f1e..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/route/RouteProvider.scala +++ /dev/null @@ -1,15 +0,0 @@ -package com.greencatsoft.angularjs.route - -import scala.scalajs.js - -trait RouteProvider extends js.Object { - - def when(path: String, route: Route): this.type = ??? - - def otherwise(route: Route): this.type = ??? -} - -object RouteProvider { - - val Name = "$routeProvider" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/route/RouteProviderAware.scala b/src/main/scala/com/greencatsoft/angularjs/route/RouteProviderAware.scala deleted file mode 100644 index 3915a8b..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/route/RouteProviderAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.route - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait RouteProviderAware extends InjectionTarget { - - implicit var routeProvider: RouteProvider = _ - - override def dependencies = super.dependencies :+ RouteProvider.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(RouteProvider.Name) ensuring (_ >= 0) - this.routeProvider = args(index).asInstanceOf[RouteProvider] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/scope/RootScope.scala b/src/main/scala/com/greencatsoft/angularjs/scope/RootScope.scala deleted file mode 100644 index bbd47e2..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/scope/RootScope.scala +++ /dev/null @@ -1,8 +0,0 @@ -package com.greencatsoft.angularjs.scope - -trait RootScope extends Scope - -object RootScope { - - val Name = "$rootScope" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/scope/RootScopeAware.scala b/src/main/scala/com/greencatsoft/angularjs/scope/RootScopeAware.scala deleted file mode 100644 index af6ffc5..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/scope/RootScopeAware.scala +++ /dev/null @@ -1,21 +0,0 @@ -package com.greencatsoft.angularjs.scope - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait RootScopeAware extends InjectionTarget with Scoped { - - implicit var rootScope: ScopeType = _ - - override type ScopeType <: RootScope - - override def dependencies = super.dependencies :+ RootScope.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(RootScope.Name) ensuring (_ >= 0) - this.rootScope = args(index).asInstanceOf[ScopeType] - } -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/scope/Scope.scala b/src/main/scala/com/greencatsoft/angularjs/scope/Scope.scala deleted file mode 100755 index 208bb41..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/scope/Scope.scala +++ /dev/null @@ -1,37 +0,0 @@ -package com.greencatsoft.angularjs.scope - -import scala.scalajs.js - -import com.greencatsoft.angularjs.Injectable - -trait Scope extends Injectable { - - def $id: String = ??? - - def $apply(exp: js.Any = null): js.Any = ??? - - def $broadcast(name: String, args: js.Any*): js.Object = ??? - - def $destroy(): Unit = ??? - - def $digest(): Unit = ??? - - def $emit(name: String, args: js.Any*): js.Object = ??? - - def $eval(expression: js.Any = null, locals: js.Object = null): js.Any = ??? - - def $evalAsync(expression: js.Any = null): Unit = ??? - - def $new(isolate: Boolean): Scope = ??? - - def $on(name: String, listener: js.Function): js.Any = ??? - - def $watch(watchExpression: js.Any, listener: js.Any = null, objectEquality: Boolean = false): js.Function = ??? - - def $watchCollection(obj: js.Any, listener: js.Function): js.Function = ??? -} - -object Scope { - - val Name = "$scope" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/scope/ScopeAware.scala b/src/main/scala/com/greencatsoft/angularjs/scope/ScopeAware.scala deleted file mode 100644 index c8524ac..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/scope/ScopeAware.scala +++ /dev/null @@ -1,27 +0,0 @@ -package com.greencatsoft.angularjs.scope - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait ScopeAware extends InjectionTarget with Scoped { - - var currentScope: Option[ScopeType] = None - - override def dependencies = super.dependencies :+ Scope.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Scope.Name) ensuring (_ >= 0) - - val scope = args(index).asInstanceOf[ScopeType] - scope.dynamic.controller = this.asInstanceOf[js.Object] - - this.currentScope = Some(scope) - } - - override def initialize(): Unit = currentScope.foreach(initialize(_)) - - def initialize(scope: ScopeType): Unit = Unit -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/scope/Scoped.scala b/src/main/scala/com/greencatsoft/angularjs/scope/Scoped.scala deleted file mode 100644 index 503368c..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/scope/Scoped.scala +++ /dev/null @@ -1,13 +0,0 @@ -package com.greencatsoft.angularjs.scope - -import scala.scalajs.js - -trait Scoped { - - type ScopeType <: Scope - - implicit class DynamicScope(scope: ScopeType) { - - def dynamic = scope.asInstanceOf[js.Dynamic] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/timer/Interval.scala b/src/main/scala/com/greencatsoft/angularjs/timer/Interval.scala deleted file mode 100755 index 6456a47..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/timer/Interval.scala +++ /dev/null @@ -1,17 +0,0 @@ -package com.greencatsoft.angularjs.timer - -import scala.scalajs.js -import com.greencatsoft.angularjs.Injectable -import com.greencatsoft.angularjs.q.Promise - -trait Interval extends Injectable { - - def apply(fn: js.Function0[_], delay: Int = 0, invokeApply: Boolean = true): Promise = ??? - - def cancel(promise: Promise = null): Boolean = ??? -} - -object Interval { - - val Name = "$interval" -} diff --git a/src/main/scala/com/greencatsoft/angularjs/timer/IntervalAware.scala b/src/main/scala/com/greencatsoft/angularjs/timer/IntervalAware.scala deleted file mode 100755 index ada3293..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/timer/IntervalAware.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.greencatsoft.angularjs.timer - -import scala.scalajs.js -import com.greencatsoft.angularjs.InjectionTarget - -trait IntervalAware extends InjectionTarget { - - implicit var interval: Interval = _ - - override def dependencies = super.dependencies :+ Interval.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Interval.Name) ensuring (_ >= 0) - this.interval = args(index).asInstanceOf[Interval] - } -} diff --git a/src/main/scala/com/greencatsoft/angularjs/timer/Timeout.scala b/src/main/scala/com/greencatsoft/angularjs/timer/Timeout.scala deleted file mode 100755 index f7bd602..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/timer/Timeout.scala +++ /dev/null @@ -1,18 +0,0 @@ -package com.greencatsoft.angularjs.timer - -import scala.scalajs.js - -import com.greencatsoft.angularjs.Injectable -import com.greencatsoft.angularjs.q.Promise - -trait Timeout extends Injectable { - - def apply(fn: js.Function0[_], delay: Int = 0, invokeApply: Boolean = true): Promise = ??? - - def cancel(promise: Promise = null): Boolean = ??? -} - -object Timeout { - - val Name = "$timeout" -} \ No newline at end of file diff --git a/src/main/scala/com/greencatsoft/angularjs/timer/TimeoutAware.scala b/src/main/scala/com/greencatsoft/angularjs/timer/TimeoutAware.scala deleted file mode 100755 index 6721074..0000000 --- a/src/main/scala/com/greencatsoft/angularjs/timer/TimeoutAware.scala +++ /dev/null @@ -1,19 +0,0 @@ -package com.greencatsoft.angularjs.timer - -import scala.scalajs.js - -import com.greencatsoft.angularjs.InjectionTarget - -trait TimeoutAware extends InjectionTarget { - - implicit var timeout: Timeout = _ - - override def dependencies = super.dependencies :+ Timeout.Name - - override def inject(args: Seq[js.Any]) { - super.inject(args) - - var index = dependencies.indexOf(Timeout.Name) ensuring (_ >= 0) - this.timeout = args(index).asInstanceOf[Timeout] - } -} \ No newline at end of file