diff --git a/.gitignore b/.gitignore
index 13ed183..5584cd5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,6 @@ tmp
.DS_Store
.idea
src/libs
-data/db.json
\ No newline at end of file
+data/db.json
+dist/
+src/dist/
\ No newline at end of file
diff --git a/README.md b/README.md
index d93a6f8..96fa4d8 100644
--- a/README.md
+++ b/README.md
@@ -18,4 +18,38 @@ To run the application we type
`npm start` - this loads the application using a local webserver, check the console for the port number to use.
-The application is a simple contacts application where you can search, create or edit a contact.
\ No newline at end of file
+The application is a simple contacts application where you can search, create or edit a contact.
+
+# Steps for Migration.
+
+Preparing for migration:
+
+STEP 1:
+
+Follow the step 1 of angular style guide https://github.com/johnpapa/angular-styleguide
+
+Single Responsibility: Organize the code in such a maner that 1 file contains only one component.
+
+STEP 2:
+
+Move all the dependencies from bower to npm with approprate npm naming and version in package.json and run npm install.
+
+Convert all the JS files to TS files.
+Add index.ts files in each directory importing all the entities.
+
+install following dev dependencies: rimraf, ts-loader, typescript, webpack, @types/angular
+npm install rimraf ts-loader typescript webpack @types/angular --save-dev
+
+run tsc --init in project dir to generate tsconfig.json file and set appropriate ts configuration options.
+
+Create webpack.config.js file and configure webpack options accordingly.
+
+add amin.ts file containing all the imports corresponding to the scripts in index.html file and remove scripts from index.html file.
+
+add bundle.js file in script tag in index.html file.
+
+add build script in package.json rimraf src/dist && webpack --bail --progress --profile
+
+run build scipt start the app and verify if everything works file.
+
+optionally can add dist folders to .gitignore file.
\ No newline at end of file
diff --git a/package.json b/package.json
index 2e9e524..64dec83 100644
--- a/package.json
+++ b/package.json
@@ -6,14 +6,36 @@
"scripts": {
"server": "cp ./data/orig-db.json ./data/db.json && json-server --watch ./data/db.json",
"setup": "bower install",
- "start": "cd src && serve"
+ "start": "cd src && serve",
+ "build": "rimraf src/dist && webpack --bail --progress --profile"
},
"author": "",
"license": "ISC",
- "dependencies": {},
+ "dependencies": {
+ "angular": "1.4.0",
+ "angular-animate": "1.4.0",
+ "angular-auto-validate": "^1.19.0",
+ "angular-ladda": "^0.4.3",
+ "angular-resource": "1.4.0",
+ "angular-spinner": "^1.0.1",
+ "angular-strap": "^2.3.12",
+ "angular-ui-router": "^0.4.2",
+ "angularjs-toaster": "^2.1.0",
+ "bootstrap": "3.3.2",
+ "bootstrap-additions": "0.3.1",
+ "font-awesome": "4.3.0",
+ "jquery": "2.1.3",
+ "ng-infinite-scroll": "1.2.1"
+ },
"devDependencies": {
+ "@types/angular": "^1.8.4",
"bower": "^1.8.0",
"json-server": "^0.9.6",
- "serve": "^5.1.2"
+ "rimraf": "^3.0.2",
+ "serve": "^5.1.2",
+ "ts-loader": "^9.4.1",
+ "typescript": "^4.8.4",
+ "webpack": "^5.74.0",
+ "webpack-cli": "^4.10.0"
}
}
diff --git a/src/app/app.main.js b/src/app/app.main.ts
similarity index 80%
rename from src/app/app.main.js
rename to src/app/app.main.ts
index 197434d..5065e73 100644
--- a/src/app/app.main.js
+++ b/src/app/app.main.ts
@@ -11,10 +11,10 @@ angular
"ui.router"
])
.config(function(
- $httpProvider,
- $resourceProvider,
- laddaProvider,
- $datepickerProvider
+ $httpProvider: any,
+ $resourceProvider: any,
+ laddaProvider: any,
+ $datepickerProvider: any
) {
laddaProvider.setOption({
style: "expand-right"
diff --git a/src/app/app.routes.js b/src/app/app.routes.ts
similarity index 92%
rename from src/app/app.routes.js
rename to src/app/app.routes.ts
index 2f98217..6e883b2 100644
--- a/src/app/app.routes.js
+++ b/src/app/app.routes.ts
@@ -1,6 +1,6 @@
angular
.module("codecraft")
- .config(function($stateProvider, $urlRouterProvider) {
+ .config(function($stateProvider: any, $urlRouterProvider: any) {
$stateProvider
.state("list", {
url: "/",
diff --git a/src/app/controllers.js b/src/app/controllers.js
deleted file mode 100644
index f78828c..0000000
--- a/src/app/controllers.js
+++ /dev/null
@@ -1,48 +0,0 @@
-angular
- .module("codecraft")
- .controller("PersonCreateController", function(
- $scope,
- $state,
- ContactService
- ) {
- $scope.contacts = ContactService;
- $scope.person = {};
-
- $scope.save = function() {
- console.log("createContact");
- $scope.contacts.createContact($scope.person).then(function() {
- $state.go("list");
- });
- };
- })
- .controller("PersonEditController", function(
- $scope,
- $stateParams,
- $state,
- ContactService
- ) {
- $scope.contacts = ContactService;
- $scope.person = $scope.contacts.getPerson($stateParams.email);
-
- $scope.save = function() {
- $scope.contacts.updateContact($scope.person).then(function() {
- $state.go("list");
- });
- };
-
- $scope.remove = function() {
- $scope.contacts.removeContact($scope.person).then(function() {
- $state.go("list");
- });
- };
- })
- .controller("PersonListController", function($scope, ContactService) {
- $scope.contacts = ContactService;
- })
- .controller("SearchController", function($scope, ContactService) {
- $scope.contacts = ContactService;
-
- $scope.loadMore = function() {
- $scope.contacts.loadMore();
- };
- });
diff --git a/src/app/controllers/index.ts b/src/app/controllers/index.ts
new file mode 100644
index 0000000..acd2c80
--- /dev/null
+++ b/src/app/controllers/index.ts
@@ -0,0 +1,4 @@
+import './person-create.controller';
+import './person-edit.controller';
+import './person-list.controller';
+import './search.controller';
diff --git a/src/app/controllers/person-create.controller.ts b/src/app/controllers/person-create.controller.ts
new file mode 100644
index 0000000..0b90189
--- /dev/null
+++ b/src/app/controllers/person-create.controller.ts
@@ -0,0 +1,17 @@
+angular
+ .module("codecraft")
+ .controller("PersonCreateController", function(
+ $scope,
+ $state,
+ ContactService
+ ) {
+ $scope.contacts = ContactService;
+ $scope.person = {};
+
+ $scope.save = function() {
+ console.log("createContact");
+ $scope.contacts.createContact($scope.person).then(function() {
+ $state.go("list");
+ });
+ };
+ })
diff --git a/src/app/controllers/person-edit.controller.ts b/src/app/controllers/person-edit.controller.ts
new file mode 100644
index 0000000..f6d76f7
--- /dev/null
+++ b/src/app/controllers/person-edit.controller.ts
@@ -0,0 +1,23 @@
+angular
+ .module("codecraft")
+ .controller("PersonEditController", function(
+ $scope,
+ $stateParams,
+ $state,
+ ContactService
+ ) {
+ $scope.contacts = ContactService;
+ $scope.person = $scope.contacts.getPerson($stateParams.email);
+
+ $scope.save = function() {
+ $scope.contacts.updateContact($scope.person).then(function() {
+ $state.go("list");
+ });
+ };
+
+ $scope.remove = function() {
+ $scope.contacts.removeContact($scope.person).then(function() {
+ $state.go("list");
+ });
+ };
+ })
\ No newline at end of file
diff --git a/src/app/controllers/person-list.controller.ts b/src/app/controllers/person-list.controller.ts
new file mode 100644
index 0000000..258191e
--- /dev/null
+++ b/src/app/controllers/person-list.controller.ts
@@ -0,0 +1,5 @@
+angular
+ .module("codecraft")
+ .controller("PersonListController", function($scope, ContactService) {
+ $scope.contacts = ContactService;
+ })
diff --git a/src/app/controllers/search.controller.ts b/src/app/controllers/search.controller.ts
new file mode 100644
index 0000000..5c70fed
--- /dev/null
+++ b/src/app/controllers/search.controller.ts
@@ -0,0 +1,9 @@
+angular
+ .module("codecraft")
+ .controller("SearchController", function($scope, ContactService) {
+ $scope.contacts = ContactService;
+
+ $scope.loadMore = function() {
+ $scope.contacts.loadMore();
+ };
+ });
diff --git a/src/app/directives.js b/src/app/directives/card.directive.ts
similarity index 71%
rename from src/app/directives.js
rename to src/app/directives/card.directive.ts
index 5a6d920..b7ccd3a 100644
--- a/src/app/directives.js
+++ b/src/app/directives/card.directive.ts
@@ -18,13 +18,3 @@ angular
}
};
})
- .directive("ccSpinner", function() {
- return {
- restrict: "AE",
- templateUrl: "templates/spinner.html",
- scope: {
- isLoading: "=",
- message: "@"
- }
- };
- });
diff --git a/src/app/directives/index.ts b/src/app/directives/index.ts
new file mode 100644
index 0000000..94de91b
--- /dev/null
+++ b/src/app/directives/index.ts
@@ -0,0 +1,2 @@
+import './card.directive';
+import './spinner.directive';
diff --git a/src/app/directives/spinner.directive.ts b/src/app/directives/spinner.directive.ts
new file mode 100644
index 0000000..0d452cc
--- /dev/null
+++ b/src/app/directives/spinner.directive.ts
@@ -0,0 +1,12 @@
+angular
+ .module("codecraft")
+ .directive("ccSpinner", function() {
+ return {
+ restrict: "AE",
+ templateUrl: "templates/spinner.html",
+ scope: {
+ isLoading: "=",
+ message: "@"
+ }
+ };
+ });
diff --git a/src/app/filters.js b/src/app/filters.js
deleted file mode 100644
index 13193f3..0000000
--- a/src/app/filters.js
+++ /dev/null
@@ -1,11 +0,0 @@
-angular.module("codecraft").filter("defaultImage", function() {
- return function(input, param) {
- if (!param) {
- param = "/img/avatar.png";
- }
- if (!input) {
- return param;
- }
- return input;
- };
-});
diff --git a/src/app/filters/default-image.filter.ts b/src/app/filters/default-image.filter.ts
new file mode 100644
index 0000000..0dbfee2
--- /dev/null
+++ b/src/app/filters/default-image.filter.ts
@@ -0,0 +1,12 @@
+angular.module("codecraft").filter("defaultImage", function() {
+ return function(input: any, param: any) {
+ if (!param) {
+ param = "/img/avatar.png";
+ }
+ if (!input) {
+ return param;
+ }
+ return input;
+ };
+ });
+
\ No newline at end of file
diff --git a/src/app/filters/index.ts b/src/app/filters/index.ts
new file mode 100644
index 0000000..b3ecb76
--- /dev/null
+++ b/src/app/filters/index.ts
@@ -0,0 +1 @@
+import './default-image.filter';
\ No newline at end of file
diff --git a/src/app/main.ts b/src/app/main.ts
new file mode 100644
index 0000000..43b7a3e
--- /dev/null
+++ b/src/app/main.ts
@@ -0,0 +1,19 @@
+import 'angular';
+import 'angular-resource';
+import 'angular-animate'
+
+import 'ng-infinite-scroll';
+import 'angular-spinner';
+import 'angular-auto-validate/dist/jcs-auto-validate';
+import 'angular-ladda';
+import 'angular-strap';
+import 'angularjs-toaster';
+import 'angular-ui-router';
+
+
+import './app.main';
+import './services';
+import './filters';
+import './directives';
+import './controllers';
+import './app.routes';
diff --git a/src/app/services/contact.resource.ts b/src/app/services/contact.resource.ts
new file mode 100644
index 0000000..12e6620
--- /dev/null
+++ b/src/app/services/contact.resource.ts
@@ -0,0 +1,13 @@
+angular
+ .module("codecraft")
+ .factory("Contact", function($resource : any) {
+ return $resource(
+ "http://localhost:3000/contacts/:id",
+ {id: "@id"},
+ {
+ update: {
+ method: "PUT"
+ }
+ }
+ );
+ })
diff --git a/src/app/services.js b/src/app/services/contact.service.ts
similarity index 81%
rename from src/app/services.js
rename to src/app/services/contact.service.ts
index dc5196b..7cf64d9 100644
--- a/src/app/services.js
+++ b/src/app/services/contact.service.ts
@@ -1,22 +1,11 @@
angular
.module("codecraft")
- .factory("Contact", function($resource) {
- return $resource(
- "http://localhost:3000/contacts/:id",
- {id: "@id"},
- {
- update: {
- method: "PUT"
- }
- }
- );
- })
- .factory("ContactService", function(Contact, $rootScope, $q, toaster) {
+ .factory("ContactService", function(Contact: any, $rootScope: any, $q: any, toaster: any) {
var self = {
- getPerson: function(email) {
+ getPerson: function(email: any) {
console.log(email);
for (var i = 0; i < self.persons.length; i++) {
- var obj = self.persons[i];
+ var obj: any = self.persons[i];
if (obj.email == email) {
return obj;
}
@@ -26,10 +15,11 @@ angular
hasMore: true,
isLoading: false,
isSaving: false,
- persons: [],
+ persons: [] as any[],
search: null,
sorting: "name",
ordering: "ASC",
+ isDeleting: false,
doSearch: function() {
self.hasMore = true;
self.page = 1;
@@ -53,7 +43,7 @@ angular
q: self.search
};
- Contact.query(params, function(data) {
+ Contact.query(params, function(data: any) {
console.debug(data);
angular.forEach(data, function(person) {
self.persons.push(new Contact(person));
@@ -72,7 +62,7 @@ angular
self.loadContacts();
}
},
- updateContact: function(person) {
+ updateContact: function(person: any) {
var d = $q.defer();
self.isSaving = true;
person.$update().then(function() {
@@ -82,10 +72,10 @@ angular
});
return d.promise;
},
- removeContact: function(person) {
+ removeContact: function(person: any) {
var d = $q.defer();
self.isDeleting = true;
- name = person.name;
+ var name = person.name;
person.$remove().then(function() {
self.isDeleting = false;
var index = self.persons.indexOf(person);
@@ -95,7 +85,7 @@ angular
});
return d.promise;
},
- createContact: function(person) {
+ createContact: function(person: any) {
var d = $q.defer();
self.isSaving = true;
Contact.save(person).$promise.then(function() {
diff --git a/src/app/services/index.ts b/src/app/services/index.ts
new file mode 100644
index 0000000..df2669f
--- /dev/null
+++ b/src/app/services/index.ts
@@ -0,0 +1,2 @@
+import './contact.resource';
+import './contact.service';
diff --git a/src/index.html b/src/index.html
index 25ff5e7..37bb54e 100644
--- a/src/index.html
+++ b/src/index.html
@@ -49,30 +49,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+