diff --git a/config/htpasswd b/config/htpasswd new file mode 100644 index 0000000000000000000000000000000000000000..b0182b2d93243b2fe13594c790d5084402af5a6b --- /dev/null +++ b/config/htpasswd @@ -0,0 +1 @@ +admin:Tb2N/R.D.JEf6 diff --git a/config/nginx.conf b/config/nginx.conf index b8cb9b93ab186586f39539c52088a2892a234c27..0ce74eeb0162aa107fc4e2a726c566d170a25b41 100644 --- a/config/nginx.conf +++ b/config/nginx.conf @@ -22,6 +22,9 @@ http { listen [::]:80; server_name $DOMAIN www.$DOMAIN; location / { + auth_basic "Please log in."; + auth_basic_user_file $CODEROOT/config/htpasswd; + root $CODEROOT/front; try_files $uri$args $uri$args/ $uri/ /index.html =404; } diff --git a/front/current/assets/fontello/config.json b/front/current/assets/fontello/config.json index f560a3e854b1c66da96a3f644fd5794a1566c067..7785853b5c100944ec924f21be18cfa98f9a0a2a 100644 --- a/front/current/assets/fontello/config.json +++ b/front/current/assets/fontello/config.json @@ -65,6 +65,12 @@ "css": "fax", "code": 59401, "src": "fontawesome" + }, + { + "uid": "128d63150a41800e0beff55235269542", + "css": "upload", + "code": 59402, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/front/current/assets/fontello/css/blocpower-codes.css b/front/current/assets/fontello/css/blocpower-codes.css index c206aafe6073d16e4a326b80ee45595da935cd15..d35dd5d01fb7199e9b3be32228b87e9f643bd492 100644 --- a/front/current/assets/fontello/css/blocpower-codes.css +++ b/front/current/assets/fontello/css/blocpower-codes.css @@ -8,4 +8,5 @@ .icon-handset:before { content: '\e806'; } /* '' */ .icon-mobile:before { content: '\e807'; } /* '' */ .icon-envelope:before { content: '\e808'; } /* '' */ -.icon-fax:before { content: '\e809'; } /* '' */ \ No newline at end of file +.icon-fax:before { content: '\e809'; } /* '' */ +.icon-upload:before { content: '\e80a'; } /* '' */ \ No newline at end of file diff --git a/front/current/assets/fontello/css/blocpower-embedded.css b/front/current/assets/fontello/css/blocpower-embedded.css index 4794422e4d60d832ce08f36d6f35a009f5a10562..64bac37b1bb9a52c1a75b141bef8be0284cc3f50 100644 --- a/front/current/assets/fontello/css/blocpower-embedded.css +++ b/front/current/assets/fontello/css/blocpower-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'blocpower'; - src: url('../font/blocpower.eot?54828926'); - src: url('../font/blocpower.eot?54828926#iefix') format('embedded-opentype'), - url('../font/blocpower.svg?54828926#blocpower') format('svg'); + src: url('../font/blocpower.eot?944541'); + src: url('../font/blocpower.eot?944541#iefix') format('embedded-opentype'), + url('../font/blocpower.svg?944541#blocpower') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'blocpower'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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RSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'blocpower'; - src: url('../font/blocpower.svg?54828926#blocpower') format('svg'); + src: url('../font/blocpower.svg?944541#blocpower') format('svg'); } } */ @@ -61,4 +61,5 @@ .icon-handset:before { content: '\e806'; } /* '' */ .icon-mobile:before { content: '\e807'; } /* '' */ .icon-envelope:before { content: '\e808'; } /* '' */ -.icon-fax:before { content: '\e809'; } /* '' */ \ No newline at end of file +.icon-fax:before { content: '\e809'; } /* '' */ +.icon-upload:before { content: '\e80a'; } /* '' */ \ No newline at end of file diff --git a/front/current/assets/fontello/css/blocpower-ie7-codes.css b/front/current/assets/fontello/css/blocpower-ie7-codes.css index 1371cb165c3bbb50dada1c5bd8e6b7c3e368753b..52046ba21b34ec4b38b2aaab0b6ea33aef19ae3d 100644 --- a/front/current/assets/fontello/css/blocpower-ie7-codes.css +++ b/front/current/assets/fontello/css/blocpower-ie7-codes.css @@ -8,4 +8,5 @@ .icon-handset { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mobile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-envelope { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-fax { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-fax { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/front/current/assets/fontello/css/blocpower-ie7.css b/front/current/assets/fontello/css/blocpower-ie7.css index 161ff92b6534450da8d04b14dfa8f07ef754a346..f8e2262b4c6e3f540c4dc140163107fef54f8a5c 100644 --- a/front/current/assets/fontello/css/blocpower-ie7.css +++ b/front/current/assets/fontello/css/blocpower-ie7.css @@ -19,4 +19,5 @@ .icon-handset { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-mobile { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-envelope { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.icon-fax { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.icon-fax { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/front/current/assets/fontello/css/blocpower.css b/front/current/assets/fontello/css/blocpower.css index be8198707dc24934edf2e5b25c8f958e25aa2cc8..c7554454375fcd2748e9412d4b70fb024c6f1034 100644 --- a/front/current/assets/fontello/css/blocpower.css +++ b/front/current/assets/fontello/css/blocpower.css @@ -1,11 +1,11 @@ @font-face { font-family: 'blocpower'; - src: url('../font/blocpower.eot?92066164'); - src: url('../font/blocpower.eot?92066164#iefix') format('embedded-opentype'), - url('../font/blocpower.woff2?92066164') format('woff2'), - url('../font/blocpower.woff?92066164') format('woff'), - url('../font/blocpower.ttf?92066164') format('truetype'), - url('../font/blocpower.svg?92066164#blocpower') format('svg'); + src: url('../font/blocpower.eot?52046343'); + src: url('../font/blocpower.eot?52046343#iefix') format('embedded-opentype'), + url('../font/blocpower.woff2?52046343') format('woff2'), + url('../font/blocpower.woff?52046343') format('woff'), + url('../font/blocpower.ttf?52046343') format('truetype'), + url('../font/blocpower.svg?52046343#blocpower') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'blocpower'; - src: url('../font/blocpower.svg?92066164#blocpower') format('svg'); + src: url('../font/blocpower.svg?52046343#blocpower') format('svg'); } } */ @@ -64,4 +64,5 @@ .icon-handset:before { content: '\e806'; } /* '' */ .icon-mobile:before { content: '\e807'; } /* '' */ .icon-envelope:before { content: '\e808'; } /* '' */ -.icon-fax:before { content: '\e809'; } /* '' */ \ No newline at end of file +.icon-fax:before { content: '\e809'; } /* '' */ +.icon-upload:before { content: '\e80a'; } /* '' */ \ No newline at end of file diff --git a/front/current/assets/fontello/font/blocpower.eot b/front/current/assets/fontello/font/blocpower.eot index cb1ef8ba62713411ab528cdf8fce4da3721e8ceb..38c80942c5fed9690229a7e7769c0519e2194646 100644 Binary files a/front/current/assets/fontello/font/blocpower.eot and b/front/current/assets/fontello/font/blocpower.eot differ diff --git a/front/current/assets/fontello/font/blocpower.svg b/front/current/assets/fontello/font/blocpower.svg index ad798283a2df0adf2c8ef092b8468ae4f3bce4e5..5bbd3fb9437d07361c0a363d79682bbc7fe584d8 100644 --- a/front/current/assets/fontello/font/blocpower.svg +++ b/front/current/assets/fontello/font/blocpower.svg @@ -25,6 +25,8 @@ + + \ No newline at end of file diff --git a/front/current/assets/fontello/font/blocpower.ttf b/front/current/assets/fontello/font/blocpower.ttf index 01a9b73af54b2978ea1c83b3d7cf58abecb39035..6473b344e6e8f02df119bb36d8eb8145e9a03003 100644 Binary files a/front/current/assets/fontello/font/blocpower.ttf and b/front/current/assets/fontello/font/blocpower.ttf differ diff --git a/front/current/assets/fontello/font/blocpower.woff b/front/current/assets/fontello/font/blocpower.woff index 194edbf3ecd4474427e49eb22132969d1c5582d7..e7244bcc25a1078ad263198bf58ccb0ff2efbf32 100644 Binary files a/front/current/assets/fontello/font/blocpower.woff and b/front/current/assets/fontello/font/blocpower.woff differ diff --git a/front/current/assets/fontello/font/blocpower.woff2 b/front/current/assets/fontello/font/blocpower.woff2 index fb2ebe0904e0c31bbc80e27ed9172821ebf0d737..76bbea9abca85683a65482596f2805a980c7317c 100644 Binary files a/front/current/assets/fontello/font/blocpower.woff2 and b/front/current/assets/fontello/font/blocpower.woff2 differ diff --git a/front/current/assets/styles/components/_global.scss b/front/current/assets/styles/components/_global.scss index 3e18655e781f177fc92846353dd4540671e09485..900bc13b5782866d06ba22aa8a680282a5eafcb6 100644 --- a/front/current/assets/styles/components/_global.scss +++ b/front/current/assets/styles/components/_global.scss @@ -31,9 +31,16 @@ html { } body { - margin: 0; - height: 100%; + margin: 0; + height: 100%; + overflow: hidden; +} + +my-app { + display: block; + height: 100%; } + /* Copy & Lists */ p { line-height: $leading; @@ -79,6 +86,9 @@ a { } } +/* Inputs */ +label { cursor: pointer; } + /* Tables */ table { border-spacing: 0px; @@ -96,6 +106,16 @@ code { /* Addresses */ address { font-style: normal; } +/* Hidden */ +input[type=file].hidden { + width: 0.1px; + height: 0.1px; + position: absolute; + opacity: 0; + overflow: hidden; + z-index: -1; +} + /* Leading paragraph text */ .lead { font-size: $scale * 1rem; diff --git a/front/current/assets/styles/components/_project.scss b/front/current/assets/styles/components/_project.scss index e41e1d795154e89c3cdd274bdb143980758abf4b..413adc92d9a888ed444c65dd52dadc08ad345634 100644 --- a/front/current/assets/styles/components/_project.scss +++ b/front/current/assets/styles/components/_project.scss @@ -6,13 +6,16 @@ } project { - display: block; + display: flex; + flex-direction: column; margin-left: 50px; + height: 100%; header { display: flex; border-bottom: 1px solid $light-gray; - min-height: 220px; + flex-basis: 300px; + flex-grow: 0; .project-details, .project-contacts { padding: 10px; } .project-details { @@ -39,4 +42,25 @@ project { } } } + + document-slots { + display: block; + flex-grow: 1; + overflow: auto; + padding: 10px; + + document-slot { + display: block; + margin: 10px; + + ul.document-list { + list-style-type: none; + + li { + margin-left: 10px; + margin-top: 5px; + } + } + } + } } diff --git a/front/current/components/project/detail.component.html b/front/current/components/project/detail.component.html index 78dc2f99e6b9571bbdc818f6b775f6c7a377e587..08e5f39e0deae9ce6d85d26e478cb061aa388d14 100644 --- a/front/current/components/project/detail.component.html +++ b/front/current/components/project/detail.component.html @@ -28,3 +28,8 @@ + diff --git a/front/current/components/project/detail.component.ts b/front/current/components/project/detail.component.ts index a18e00fc8a5e48dfc413139359148324a9e96e10..c2c081242021eac35909f0c19816d24b04853a7d 100644 --- a/front/current/components/project/detail.component.ts +++ b/front/current/components/project/detail.component.ts @@ -8,15 +8,18 @@ import { ProjectService } from '../../services/project/project.service'; import { AddressService } from '../../services/project/address.service'; import { ContactService } from '../../services/project/contact.service'; import { ContactMethodService } from '../../services/project/contact-method.service'; +import { DocumentSlotService } from '../../services/project/document-slot.service'; +import { DocumentService } from '../../services/document/document.service'; import { AddressComponent } from './address.component'; import { ContactsComponent } from './contacts.component'; +import { SlotsComponent } from './slots.component'; @Component({ selector: 'project', templateUrl: config.static_url + '/components/project/detail.component.html', - directives: [ROUTER_DIRECTIVES, AddressComponent, ContactsComponent] + directives: [ROUTER_DIRECTIVES, AddressComponent, ContactsComponent, SlotsComponent] }) export class ProjectDetailComponent implements OnInit { constructor( @@ -25,7 +28,9 @@ export class ProjectDetailComponent implements OnInit { public projectService:ProjectService, public addressService:AddressService, public contactService:ContactService, - public contactMethodService:ContactMethodService + public contactMethodService:ContactMethodService, + public documentSlotService:DocumentSlotService, + public documentService:DocumentService ) {}; project:Model; @@ -33,6 +38,8 @@ export class ProjectDetailComponent implements OnInit { address:Model; contacts:Collection; contact_methods:Collection; + document_slots:Collection; + documents:Collection; ngOnInit() { let project_id = this._routeParams.get('id'); @@ -44,6 +51,9 @@ export class ProjectDetailComponent implements OnInit { .setFilters({'project_id': project_id})); this.contact_methods = (this._restService.Collection(this.contactMethodService, []) .setFilters({'project_id': project_id})); + this.document_slots = (this._restService.Collection(this.documentSlotService, []) + .setFilters({'project_id': project_id})); + this.documents = this._restService.Collection(this.documentService, []); this.fetch(); }; @@ -56,5 +66,20 @@ export class ProjectDetailComponent implements OnInit { }); this.contacts.fetch(); this.contact_methods.fetch(); + this.document_slots.fetch(this.fetchDocuments.bind(this)); + }; + + fetchDocuments() { + // Filter the documents collection by an array of keys from the document slots. + let keys = []; + + for (let document_slot of this.document_slots.models) { + let key = document_slot.data['document_key']; + keys.push(key); + } + + if (!keys.length) return; + + this.documents.setFilters({keys: keys}).fetch(); }; }; diff --git a/front/current/components/project/new-document-slot.component.html b/front/current/components/project/new-document-slot.component.html new file mode 100644 index 0000000000000000000000000000000000000000..d4ad172bf99371512db61548907440e04f36a22e --- /dev/null +++ b/front/current/components/project/new-document-slot.component.html @@ -0,0 +1,4 @@ + diff --git a/front/current/components/projects/new-document-slot.component.ts b/front/current/components/project/new-document-slot.component.ts similarity index 70% rename from front/current/components/projects/new-document-slot.component.ts rename to front/current/components/project/new-document-slot.component.ts index 8aa3ff0ce978e823e38f971249b3677065a5f53b..739c11d6308e89b36fe2f401bc3c6b56865453d0 100644 --- a/front/current/components/projects/new-document-slot.component.ts +++ b/front/current/components/project/new-document-slot.component.ts @@ -8,31 +8,31 @@ import { DocumentService } from '../../services/document/document.service'; @Component({ selector: 'new-document-slot', - inputs: ['project', 'documentSlots', 'documents'], - templateUrl: config.static_url + '/components/projects/new-document-slot.component.html' + inputs: ['project', 'document_slots', 'documents', 'role'], + templateUrl: config.static_url + '/components/project/new-document-slot.component.html' }) export class NewDocumentSlotComponent implements OnInit { constructor( private _restService:RestService, - private _documentSlotService:DocumentSlotService, - private _documentService:DocumentService + public documentSlotService:DocumentSlotService, + public documentService:DocumentService ) {}; - // Inputs public project:Model; - public documentSlots:Collection; + public document_slots:Collection; public documents:Collection; + public role:string; public documentSlot:Model; public document_:Model ngOnInit() { - this.documentSlot = this._restService.Model(this._documentSlotService, { + this.documentSlot = this._restService.Model(this.documentSlotService, { project_id: this.project.data['id'], - role: 'miscelaneous' + role: this.role }); - this.document_ = this._restService.Model(this._documentService, {}); + this.document_ = this._restService.Model(this.documentService, {}); }; public upload(e) { @@ -53,7 +53,7 @@ export class NewDocumentSlotComponent implements OnInit { .set({document_key: self.document_.data['key']}) .save(() => { self.documents.models.push(self.document_); - self.documentSlots.models.push(self.documentSlot); + self.document_slots.models.push(self.documentSlot); self.ngOnInit(); }); }); diff --git a/front/current/components/project/slot.component.html b/front/current/components/project/slot.component.html new file mode 100644 index 0000000000000000000000000000000000000000..5fe5155718715fccd4790772647cd943028b5778 --- /dev/null +++ b/front/current/components/project/slot.component.html @@ -0,0 +1,22 @@ +
{{ slot.title }}
+ + diff --git a/front/current/components/project/slot.component.ts b/front/current/components/project/slot.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e1f745e49b8f19ec89da4cc6e1118de9c92bc82 --- /dev/null +++ b/front/current/components/project/slot.component.ts @@ -0,0 +1,31 @@ +import { Component } from 'angular2/core'; +import { config } from '../../config'; +import { Model, Collection } from '../../services/rest.service'; +import { NewDocumentSlotComponent } from './new-document-slot.component'; + + +@Component({ + selector: 'document-slot', + templateUrl: config.static_url + '/components/project/slot.component.html', + inputs: [ + 'project', 'slot', 'document_slots', 'documents', 'parent_documents', + 'parent_document_slots'], + directives: [NewDocumentSlotComponent] +}) +export class SlotComponent { + project:Model; + slot:any; + document_slots:Collection; + documents:Collection; + parent_documents:Collection; + parent_document_slots:Collection; + + public download(document_:Model) { + document_.setFilters({verbosity: 'data'}).fetch(() => { + var link = document.createElement('a'); + link['download'] = document_.data['name']; + link.href = document_.data['data']; + link.click(); + }); + }; +}; diff --git a/front/current/components/project/slots.component.html b/front/current/components/project/slots.component.html new file mode 100644 index 0000000000000000000000000000000000000000..e851a9b0dcbd0921cbb62fbb411be2d9afedb6ea --- /dev/null +++ b/front/current/components/project/slots.component.html @@ -0,0 +1,16 @@ +

Documents

+ +
+

+
+
+ +
diff --git a/front/current/components/project/slots.component.ts b/front/current/components/project/slots.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..00fcc4f404d05d50b7c4a8ec8b4013f51801754d --- /dev/null +++ b/front/current/components/project/slots.component.ts @@ -0,0 +1,83 @@ +import { Component } from 'angular2/core'; + +import { config } from '../../config'; + +import { RestService, Model, Collection } from '../../services/rest.service'; +import { DocumentSlotService } from '../../services/project/document-slot.service'; +import { DocumentService } from '../../services/document/document.service'; + +import { SlotComponent } from './slot.component'; + + +@Component({ + selector: 'document-slots', + templateUrl: config.static_url + '/components/project/slots.component.html', + inputs: ['project', 'document_slots', 'documents'], + directives: [SlotComponent] +}) +export class SlotsComponent { + constructor( + private _restService:RestService, + public documentSlotService:DocumentSlotService, + public documentService:DocumentService + ) {}; + + slots:any[] = [ + {name: 'utility-bills', title: 'Utility Bills'}, + {name: 'sceep-forms', title: 'SCEEP Forms'}, + {name: 'pea-reports', title: 'PEA Reports'}, + {name: 'balance-sheets', title: 'Balance Sheets'}, + {name: 'income-statements', title: 'Income Statements'}, + {name: 'financial-reports', title: 'Financial Reports'}, + {name: 'taxes', title: 'Taxes'}, + {name: 'credit-reports', title: 'Credit Reports'}, + {name: 'certificate-of-incorporation', title: 'Certificate of Incorporation'}, + {name: 'bank-statements', title: 'Bank Statements'}, + {name: '501(c)3-confirmation', title: '501(c)3 Confirmation'}, + {name: 'proof-of-insurance', title: 'Proof of Property and Liability Insurance'}, + {name: 'property-appraisal', title: 'Property Appraisal'}, + {name: 'title-of-location', title: 'Title of Location'}, + {name: 'nyserda', title: 'NYSERDA Request for Financing Form'}, + {name: 'loan-application', title: 'Loan Application'}, + {name: 'contractor-quotes', title: 'Contractor Quotes'}, + {name: 'misc', title: 'Miscellaneous'} + ] + project:Model + document_slots:Collection; + documents:Collection; + + public getDocumentSlots(slot:any) { + // Gets a subset of document slots for the given slot description. + let documentSlots = []; + let collection = this._restService.Collection(this.documentSlotService, []); + + for (let documentSlot of this.document_slots.models) { + if (documentSlot.data['role'] == slot.name) + documentSlots.push(documentSlot); + } + + collection.models = documentSlots; + return collection; + }; + + public getDocuments(slot:any) { + // Gets a subset of documents for the given slot description. + let documents = []; + let collection = this._restService.Collection(this.documentService, []); + let document_slots = this.getDocumentSlots(slot); + let keys = []; + + for (let document_slot of document_slots.models) { + let key = document_slot.data['document_key']; + keys.push(key); + } + + for (let document_ of this.documents.models) { + if (keys.indexOf(document_.data['key']) > -1) + documents.push(document_); + } + + collection.models = documents; + return collection; + } +}; diff --git a/front/current/components/projects/list.component.html b/front/current/components/projects/list.component.html index ed73f4d1e644f17a9208d9214507c524e29a49b3..9a992665b8855812fcf82980dcf213b958ceb9cd 100644 --- a/front/current/components/projects/list.component.html +++ b/front/current/components/projects/list.component.html @@ -9,17 +9,16 @@ status name - documents - + - + {{ projects.error['status'] }}: {{ projects.error['short'] }} @@ -33,31 +32,6 @@ [routerLink]="['../Project', {id: project.data['id'], section: 'summary'}]" >{{ project.data['name'] }} - - - diff --git a/front/current/components/projects/list.component.ts b/front/current/components/projects/list.component.ts index 4753b29b21c1eb4de6f30a5c2267a2b1c82e277d..92780f7d10ed8b8e447d8389b0c747739af5610a 100644 --- a/front/current/components/projects/list.component.ts +++ b/front/current/components/projects/list.component.ts @@ -4,25 +4,17 @@ import { Control } from 'angular2/common'; import { config } from '../../config'; import { RestService, Model, Collection } from '../../services/rest.service'; - import { ProjectService } from '../../services/project/project.service'; -import { DocumentSlotService } from '../../services/project/document-slot.service'; -import { DocumentService } from '../../services/document/document.service'; - -import { NewDocumentSlotComponent } from './new-document-slot.component'; @Component({ selector: 'project-list', templateUrl: config.static_url + '/components/projects/list.component.html', - directives: [ROUTER_DIRECTIVES, NewDocumentSlotComponent] + directives: [ROUTER_DIRECTIVES] }) export class ProjectListComponent implements OnInit { constructor( private _restService:RestService, - - private _projectService:ProjectService, - private _documentSlotService:DocumentSlotService, - private _documentService:DocumentService + private _projectService:ProjectService ) { this.q.valueChanges .debounceTime(500) @@ -34,82 +26,15 @@ export class ProjectListComponent implements OnInit { }; public projects:Collection; - public documentSlots:Collection; - public documents:Collection; public q:Control = new Control(''); ngOnInit() { this.projects = this._restService.Collection(this._projectService, []); - this.documentSlots = this._restService.Collection(this._documentSlotService, []); - this.documents = this._restService.Collection(this._documentService, []); this.fetch(); }; - public getDocumentSlotsForProject(project:Model):Collection { - let documentSlots = []; - let collection = this._restService.Collection(this._documentSlotService, []); - - for (let documentSlot of this.documentSlots.models) { - if (documentSlot.data['project_id'] == project.data['id']) - documentSlots.push(documentSlot); - } - - collection.models = documentSlots; - return collection; - }; - - public getDocumentForDocumentSlot(documentSlot:Model):Model { - for (let document_ of this.documents.models) { - if (document_.data['key'] == documentSlot.data['document_key']) { - return document_; - } - } - }; - - public download(document_:Model) { - document_.setFilters({verbosity: 'data'}).fetch(() => { - var link = document.createElement('a'); - link['download'] = document_.data['name']; - link.href = document_.data['data']; - link.click(); - }); - }; - fetch() { - this.projects.fetch(this.fetchDocumentSlots.bind(this)); - }; - - fetchDocumentSlots() { - let self = this; - let keys = []; - - for (let project of self.projects.models) { - let key = project.data['id']; - if (keys.indexOf(key) == -1) - keys.push(key) - } - - if (!keys.length) return; - - self.documentSlots - .setFilters({project_ids: keys}) - .fetch(self.fetchDocuments.bind(self)); - }; - - fetchDocuments() { - let self = this; - let keys = []; - - for (let document_slot of self.documentSlots.models) { - let key = document_slot.data['document_key']; - keys.push(key); - } - - if (!keys.length) return; - - self.documents - .setFilters({ keys: keys }) - .fetch(); + this.projects.fetch(); }; }; diff --git a/front/current/components/projects/new-document-slot.component.html b/front/current/components/projects/new-document-slot.component.html deleted file mode 100644 index 974682d65b65256ad34b93afe5f1e4e20311b0d2..0000000000000000000000000000000000000000 --- a/front/current/components/projects/new-document-slot.component.html +++ /dev/null @@ -1 +0,0 @@ -