diff --git a/.coverage b/.coverage index 7764142..ce2da6a 100644 --- a/.coverage +++ b/.coverage @@ -1 +1 @@ -!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/__init__.py": [1], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/views.py": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15, 16, 18, 20, 21, 22, 24, 27, 60], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/urls.py": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/image_edit.py": [1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 23, 24, 25, 26, 27, 31, 32, 34, 35, 36, 38, 39, 40, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 109, 110, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 127, 128, 133, 134, 135, 138, 139, 140, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/image_processor.py": [1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 20, 21, 23, 24, 25, 27, 28, 29, 31, 32, 33, 34, 35, 37, 38, 39, 40, 41], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/permissions.py": [1, 4, 6, 7], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/serializers.py": [1, 2, 3, 9, 10, 13, 15, 16, 18, 19, 20, 21, 22, 23, 25, 27, 28, 29, 30, 32, 33, 34, 37, 38, 39, 40, 42, 43, 44, 45, 46, 47, 49, 50, 53, 54, 55, 56, 59, 62, 64, 65, 67, 68, 69, 70, 71, 73, 74, 77, 78, 79, 80, 81, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 102, 103, 104, 105, 106, 108, 109, 111, 112, 114, 115, 116, 118, 119], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/views.py": [1, 2, 3, 4, 5, 6, 11, 15, 19, 20, 21, 22, 24, 25, 26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 47, 48, 51, 52, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 69, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 83, 99, 101, 102, 105, 106, 108, 109, 110, 112, 128, 130, 131, 134, 135, 136, 137, 138, 139, 141, 143, 144, 148, 149, 150, 151, 152, 153, 154, 156, 157, 160, 178, 179, 180, 181, 182, 186, 204, 205, 206, 207, 208, 211, 229, 230, 231, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 245, 246, 247, 248]}} \ No newline at end of file +!coverage.py: This is a private format, don't read it directly!{"lines": {"/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/__init__.py": [1], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/views.py": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 22, 24, 27, 60], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/urls.py": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/image_edit.py": [1, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 112, 113, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 127, 128, 130, 132, 133, 134, 135, 136, 138, 139, 140, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 157, 158, 163, 164, 165, 166, 168, 169, 170, 171, 172, 173, 175], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/image_processor.py": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/permissions.py": [1, 4, 6, 7], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/serializers.py": [1, 2, 3, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 102, 103, 104, 105, 106, 108, 109, 111, 112, 114, 115, 116, 118, 119], "/Users/andela/Documents/projects/django-app/photo-editing/app/photos/api/views.py": [1, 2, 3, 4, 5, 6, 7, 11, 12, 15, 16, 19, 20, 21, 22, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 88, 99, 101, 102, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 118, 128, 130, 131, 134, 135, 136, 137, 138, 139, 140, 141, 143, 144, 148, 149, 150, 151, 152, 153, 154, 156, 157, 159, 160, 161, 162, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 191, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 219, 220, 221, 222, 223, 225, 226, 227, 229, 230, 231, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 245, 246, 247, 248]}} \ No newline at end of file diff --git a/app/photos/api/serializers.py b/app/photos/api/serializers.py index bcd5848..8da3150 100644 --- a/app/photos/api/serializers.py +++ b/app/photos/api/serializers.py @@ -5,7 +5,6 @@ HyperlinkedIdentityField, SerializerMethodField, ) - from photos.models import * @@ -58,36 +57,20 @@ def get_photos(self, obj): return serialized_photos -class PhotoDetailSerializer(ModelSerializer): - - class Meta: - model = PhotoDetail - fields = [ - 'id', - 'title', - 'effects', - 'date_created', - 'date_modified', - ] - extra_kwargs = {'date_created': {'read_only': True}, - 'date_modified': {'read_only': True}} - - class PhotoSerializer(ModelSerializer): - detail = SerializerMethodField() folder_name = SerializerMethodField() uploader = SerializerMethodField() - file_size = SerializerMethodField() class Meta: model = Photo fields = [ 'id', 'image', + 'title', 'edited_image', 'folder_name', 'share_code', - 'detail', + 'effects', 'uploader', 'file_size', 'user', @@ -104,14 +87,4 @@ def get_folder_name(self, obj): return 'None' def get_uploader(self, obj): - return obj.user.username - - def get_file_size(self, obj): - return int(obj.image.size/1000) - - def get_detail(self, obj): - detail = PhotoDetail.objects.filter(photo=obj).first() - if(not detail): - return {} - serializer = PhotoDetailSerializer(detail) - return serializer.data + return obj.user.username \ No newline at end of file diff --git a/app/photos/api/urls.py b/app/photos/api/urls.py index dbf1212..1c40d2a 100644 --- a/app/photos/api/urls.py +++ b/app/photos/api/urls.py @@ -10,6 +10,6 @@ url(r'^photos/$', PhotoApiView.as_view(), name='list-photo'), url(r'^photos/(?P\d+)/$', SinglePhotoAPIView.as_view(), name='photo-single'), url(r'^photos/share/$', PhotoShare.as_view(), name='photo-share'), - url(r'^photos/(?P\d+)/detail/(?P\d+)/$', PhotoDetailAPIView.as_view(), name='photo-detail'), + #url(r'^photos/(?P\d+)/detail/(?P\d+)/$', PhotoDetailAPIView.as_view(), name='photo-detail'), url(r'^photos/(?P\d+)/preview/$', PhotoPreview.as_view(), name='photo-preview'), ] diff --git a/app/photos/api/views.py b/app/photos/api/views.py index b926e98..2524076 100644 --- a/app/photos/api/views.py +++ b/app/photos/api/views.py @@ -115,6 +115,31 @@ def get_queryset(self): return queryset +class SingleFolderAPIView(RetrieveUpdateDestroyAPIView): + + """ + Returns individual folder detail if you are doing a GET request. + Updates individual folder detail if you are doing a PUT request. + Deletes individual folder detail if you are doing a DELETE request. + + Method: GET + Response: JSON + + Method: PUT + Parameters: + name (required) + Response: JSON + + Method: DELETE + Response: JSON + + """ + queryset = Folder.objects.all() + serializer_class = FolderSerializer + permission_classes = [IsOwner] + lookup_field = 'id' + + class PhotoApiView(ListCreateAPIView): """ @@ -147,9 +172,8 @@ def perform_create(self, serializer): user=self.request.user, folder=folder, share_code=code) else: instance = serializer.save(user=self.request.user, share_code=code) - - detail = PhotoDetail(photo=instance) - detail.save() + instance.file_size = int(instance.image.size/1000) + instance.save() def get_queryset(self): folder_id = self.kwargs.get('id', -1) @@ -164,31 +188,6 @@ def get_queryset(self): return queryset -class SingleFolderAPIView(RetrieveUpdateDestroyAPIView): - - """ - Returns individual folder detail if you are doing a GET request. - Updates individual folder detail if you are doing a PUT request. - Deletes individual folder detail if you are doing a DELETE request. - - Method: GET - Response: JSON - - Method: PUT - Parameters: - name (required) - Response: JSON - - Method: DELETE - Response: JSON - - """ - queryset = Folder.objects.all() - serializer_class = FolderSerializer - permission_classes = [IsOwner] - lookup_field = 'id' - - class SinglePhotoAPIView(RetrieveUpdateDestroyAPIView): """ @@ -213,49 +212,20 @@ class SinglePhotoAPIView(RetrieveUpdateDestroyAPIView): permission_classes = [IsOwner] lookup_field = 'id' - def perform_destroy(self, instance): - if(os.path.isfile(instance.image.path)): - os.remove(instance.image.path) - - if(os.path.isfile(instance.image.path.replace('main', 'edited'))): - os.remove(instance.image.path.replace('main', 'edited')) - - instance.delete() - - -class PhotoDetailAPIView(RetrieveUpdateDestroyAPIView): - - """ - Returns individual photo detail if you are doing a GET request. - Updates individual photo detail if you are doing a PUT request. - Deletes individual photo detail if you are doing a DELETE request. - - Method: GET - Response: JSON - - Method: PUT - Parameters: - title (required) - Response: JSON - - Method: DELETE - Response: JSON - - """ - serializer_class = PhotoDetailSerializer - lookup_field = 'pk' - def perform_update(self, serializer): instance = serializer.save() - photo = instance.photo - image_processor = ImageProcessor(photo) + image_processor = ImageProcessor(instance) if instance.effects: effect_obj = json.loads(instance.effects) image_processor.process(effect_obj) edited_path = image_processor.save() - photo.edited_image = edited_path - photo.save() + instance.edited_image = edited_path + instance.save() - def get_queryset(self): - photo = Photo.objects.filter(id=self.kwargs.get('id', 0)).first() - return PhotoDetail.objects.filter(photo=photo) + def perform_destroy(self, instance): + if(os.path.isfile(instance.image.path)): + os.remove(instance.image.path) + + if(os.path.isfile(instance.image.path.replace('main', 'edited'))): + os.remove(instance.image.path.replace('main', 'edited')) + instance.delete() diff --git a/app/photos/migrations/0001_initial.py b/app/photos/migrations/0001_initial.py index 0e3e474..25afaf0 100644 --- a/app/photos/migrations/0001_initial.py +++ b/app/photos/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-15 19:49 +# Generated by Django 1.9.2 on 2016-07-18 20:48 from __future__ import unicode_literals from django.conf import settings @@ -34,6 +34,9 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('image', models.ImageField(blank=True, null=True, upload_to='main')), + ('title', models.CharField(default='', max_length=100)), + ('file_size', models.CharField(default='', max_length=10)), + ('effects', models.TextField(default='')), ('edited_image', models.CharField(default='', max_length=255)), ('share_code', models.CharField(default='', max_length=50)), ('date_modified', models.DateTimeField(auto_now=True)), diff --git a/app/photos/migrations/0002_auto_20160716_2231.py b/app/photos/migrations/0002_auto_20160716_2231.py deleted file mode 100644 index 5ac4b21..0000000 --- a/app/photos/migrations/0002_auto_20160716_2231.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-16 22:31 -from __future__ import unicode_literals - -import cloudinary.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('photos', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='photo', - name='date_modified', - ), - migrations.RemoveField( - model_name='photo', - name='edited_image', - ), - migrations.RemoveField( - model_name='photo', - name='share_code', - ), - migrations.AddField( - model_name='photodetail', - name='edited_image', - field=models.CharField(default='', max_length=255), - ), - migrations.AddField( - model_name='photodetail', - name='share_code', - field=models.CharField(default='', max_length=50), - ), - migrations.AlterField( - model_name='photo', - name='image', - field=cloudinary.models.CloudinaryField(default=None, max_length=255, verbose_name='image'), - preserve_default=False, - ), - ] diff --git a/app/photos/migrations/0003_auto_20160716_2330.py b/app/photos/migrations/0003_auto_20160716_2330.py deleted file mode 100644 index 8d9a789..0000000 --- a/app/photos/migrations/0003_auto_20160716_2330.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-16 23:30 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('photos', '0002_auto_20160716_2231'), - ] - - operations = [ - migrations.AlterField( - model_name='photodetail', - name='edited_image', - field=models.TextField(default=''), - ), - ] diff --git a/app/photos/migrations/0004_photodetail_image_size.py b/app/photos/migrations/0004_photodetail_image_size.py deleted file mode 100644 index 839b2d6..0000000 --- a/app/photos/migrations/0004_photodetail_image_size.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-17 13:18 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('photos', '0003_auto_20160716_2330'), - ] - - operations = [ - migrations.AddField( - model_name='photodetail', - name='image_size', - field=models.CharField(default=0, max_length=20), - ), - ] diff --git a/app/photos/migrations/0005_auto_20160718_0947.py b/app/photos/migrations/0005_auto_20160718_0947.py deleted file mode 100644 index 6b4f7e0..0000000 --- a/app/photos/migrations/0005_auto_20160718_0947.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.2 on 2016-07-18 09:47 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('photos', '0004_photodetail_image_size'), - ] - - operations = [ - migrations.RemoveField( - model_name='photodetail', - name='edited_image', - ), - migrations.RemoveField( - model_name='photodetail', - name='image_size', - ), - migrations.RemoveField( - model_name='photodetail', - name='share_code', - ), - migrations.AddField( - model_name='photo', - name='date_modified', - field=models.DateTimeField(auto_now=True, default=datetime.datetime(2016, 7, 18, 9, 47, 6, 222320, tzinfo=utc)), - preserve_default=False, - ), - migrations.AddField( - model_name='photo', - name='edited_image', - field=models.CharField(default='', max_length=255), - ), - migrations.AddField( - model_name='photo', - name='share_code', - field=models.CharField(default='', max_length=50), - ), - migrations.AlterField( - model_name='photo', - name='image', - field=models.ImageField(blank=True, null=True, upload_to='main'), - ), - ] diff --git a/app/photos/models.py b/app/photos/models.py index ad15567..d4dd4d1 100644 --- a/app/photos/models.py +++ b/app/photos/models.py @@ -28,6 +28,9 @@ class Photo(models.Model): image = models.ImageField(upload_to='main', null=True, blank=True) + title = models.CharField(max_length=100, default="") + file_size = models.CharField(max_length=10, default="") + effects = models.TextField(default='') edited_image = models.CharField(max_length=255, default="") share_code = models.CharField(max_length=50, default="") date_modified = models.DateTimeField(auto_now=True, auto_now_add=False) diff --git a/app/photos/tests/test_api.py b/app/photos/tests/test_api.py index 4c1050b..f34edcb 100644 --- a/app/photos/tests/test_api.py +++ b/app/photos/tests/test_api.py @@ -122,10 +122,9 @@ def test_photo_update(self): response = create_photo(self.client) result = decode_json(response) photo_id = result.get('id', 0) - detail_id = result.get('detail', {}).get('id', 0) - response = self.client.put('/api/v1/photos/' + str(photo_id) + '/detail/' + str(detail_id) + '/', {'title':'test image'}) + response = self.client.put('/api/v1/photos/' + str(photo_id) + '/', {'title':'test image'}) result = decode_json(response) - self.assertEqual(result.get('id'), detail_id) + self.assertEqual(result.get('id'), photo_id) self.assertEqual(result.get('title'), 'test image') def test_photo_delete(self): @@ -163,12 +162,11 @@ def test_photo_effect_update(self): response = create_photo(self.client) result = decode_json(response) photo_id = result.get('id', 0) - detail_id = result.get('detail', {}).get('id', 0) data = { 'title':'effect update', 'effects':'{"enhance":{"Brightness":"65"},"filter":{"blur":"true"},"transform":{"mirror":"true"},"effect":{"quantize":"50","gaussian_blur":"50","auto_contrast":"50","posterize":"50","unsharp_mask":"50","solarize":"50","remove_border":"50","rotate":"50"}}' } - response = self.client.put('/api/v1/photos/' + str(photo_id) + '/detail/' + str(detail_id) + '/', data) + response = self.client.put('/api/v1/photos/' + str(photo_id) + '/', data) result = decode_json(response) self.assertEqual(result.get('title'), 'effect update') @@ -176,7 +174,6 @@ def test_photo_effect_preview(self): response = create_photo(self.client) result = decode_json(response) photo_id = result.get('id', 0) - detail_id = result.get('detail', {}).get('id', 0) data = { 'photo_id':photo_id, 'effects':'{"transform":{"vertical_flip":"true","invert":"true","grayscale":"true","black_and_white":"true","equalize":"true"}}' diff --git a/app/static/build/client.min.js b/app/static/build/client.min.js index 22c3c46..86211c0 100644 --- a/app/static/build/client.min.js +++ b/app/static/build/client.min.js @@ -84,7 +84,7 @@ var _Photos2 = _interopRequireDefault(_Photos); - var _EditImage = __webpack_require__(443); + var _EditImage = __webpack_require__(444); var _EditImage2 = _interopRequireDefault(_EditImage); @@ -46017,11 +46017,11 @@ var _BackgroundSlider2 = _interopRequireDefault(_BackgroundSlider); - var _LoginForm = __webpack_require__(452); + var _LoginForm = __webpack_require__(393); var _LoginForm2 = _interopRequireDefault(_LoginForm); - var _RegisterForm = __webpack_require__(451); + var _RegisterForm = __webpack_require__(411); var _RegisterForm2 = _interopRequireDefault(_RegisterForm); @@ -46272,7 +46272,159 @@ exports.default = _class; /***/ }, -/* 393 */, +/* 393 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _react = __webpack_require__(1); + + var _react2 = _interopRequireDefault(_react); + + var _reactLoader = __webpack_require__(394); + + var _reactLoader2 = _interopRequireDefault(_reactLoader); + + var _GenericAction = __webpack_require__(396); + + var action = _interopRequireWildcard(_GenericAction); + + var _ToastAction = __webpack_require__(401); + + var Toast = _interopRequireWildcard(_ToastAction); + + var _LoginStore = __webpack_require__(402); + + var _LoginStore2 = _interopRequireDefault(_LoginStore); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _class = function (_React$Component) { + _inherits(_class, _React$Component); + + function _class() { + _classCallCheck(this, _class); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); + + _this.loginComplete = _this.loginComplete.bind(_this); + return _this; + } + + _createClass(_class, [{ + key: 'componentWillMount', + value: function componentWillMount() { + this.state = { loaded: true }; + _LoginStore2.default.on('loginComplete', this.loginComplete); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _LoginStore2.default.removeListener('loginComplete', this.loginComplete); + } + }, { + key: 'loginComplete', + value: function loginComplete(data) { + this.setState({ loaded: true }); + if (!data.data.login) { + Toast.error(data.data.message); + } else { + Toast.ok('Login Successful'); + document.location.href = '/'; + } + } + }, { + key: 'onSubmit', + value: function onSubmit(e) { + e.preventDefault(); + var dataArray = $(e.target).serializeArray(); + var form = new FormData(); + dataArray.forEach(function (data) { + form.append(data.name, data.value); + }); + this.setState({ loaded: false }); + action.perform(form, 'LOGIN'); + } + }, { + key: 'render', + value: function render() { + var label = this.props.label; + + return _react2.default.createElement( + 'form', + { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, + _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '50%' }), + _react2.default.createElement( + 'fieldset', + null, + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Username' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'text', className: 'form-control', placeholder: 'Username', name: 'username', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { htmlFor: 'password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Password' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'password', name: 'password', placeholder: 'Password', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'div', + { className: 'col-lg-10 col-lg-offset-2' }, + _react2.default.createElement( + 'button', + { type: 'submit', className: 'btn btn-primary right', disabled: !this.state.loaded }, + ' ', + _react2.default.createElement('i', { className: 'mdi mdi-login-variant' }), + ' Login' + ) + ) + ) + ) + ); + } + }]); + + return _class; + }(_react2.default.Component); + + exports.default = _class; + +/***/ }, /* 394 */ /***/ function(module, exports, __webpack_require__) { @@ -49195,7 +49347,218 @@ /***/ }, -/* 411 */, +/* 411 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _react = __webpack_require__(1); + + var _react2 = _interopRequireDefault(_react); + + var _reactLoader = __webpack_require__(394); + + var _reactLoader2 = _interopRequireDefault(_reactLoader); + + var _RegisterStore = __webpack_require__(412); + + var _RegisterStore2 = _interopRequireDefault(_RegisterStore); + + var _LoginStore = __webpack_require__(402); + + var _LoginStore2 = _interopRequireDefault(_LoginStore); + + var _GenericAction = __webpack_require__(396); + + var action = _interopRequireWildcard(_GenericAction); + + var _ToastAction = __webpack_require__(401); + + var Toast = _interopRequireWildcard(_ToastAction); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _class = function (_React$Component) { + _inherits(_class, _React$Component); + + function _class() { + _classCallCheck(this, _class); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); + + _this.loginComplete = _this.loginComplete.bind(_this); + _this.registerComplete = _this.registerComplete.bind(_this); + return _this; + } + + _createClass(_class, [{ + key: 'componentWillMount', + value: function componentWillMount() { + this.state = { loaded: true, user: {} }; + _RegisterStore2.default.on('registerComplete', this.registerComplete); + _LoginStore2.default.on('loginComplete', this.loginComplete); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _RegisterStore2.default.removeListener('registerComplete', this.registerComplete); + _LoginStore2.default.removeListener('loginComplete', this.loginComplete); + } + }, { + key: 'login', + value: function login(username, password) { + var form = new FormData(); + form.append('username', username); + form.append('password', password); + action.perform(form, 'LOGIN'); + } + }, { + key: 'registerComplete', + value: function registerComplete(data) { + this.setState({ loaded: true }); + if (data.status != 201) { + Toast.error(data.data.username[0]); + } else { + Toast.ok('Account created'); + this.login(this.state.user.username, this.state.user.password); + } + } + }, { + key: 'loginComplete', + value: function loginComplete(data) { + this.setState({ loaded: true }); + if (!data.data.login) { + Toast.error(data.data.message); + } else { + Toast.ok('Login Successful'); + document.location.href = '/'; + } + } + }, { + key: 'onSubmit', + value: function onSubmit(e) { + e.preventDefault(); + var dataArray = $(e.target).serializeArray(); + var dataObject = {}; + dataArray.forEach(function (data) { + dataObject[data.name] = data.value; + }); + this.setState({ user: dataObject }); + if (dataObject.password != dataObject.confirm_password) { + Toast.error('Password Mismatch'); + return false; + } + this.setState({ loaded: false }); + action.perform(dataObject, 'NEW_REGISTER'); + } + }, { + key: 'render', + value: function render() { + var label = this.props.label; + + return _react2.default.createElement( + 'form', + { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, + _react2.default.createElement( + 'fieldset', + null, + _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '73%' }), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { htmlFor: 'username', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Username' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'username', placeholder: 'Username', name: 'username', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { htmlFor: 'email', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Email' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'email', className: 'form-control', id: 'email', name: 'email', placeholder: 'Email', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { htmlFor: 'password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Password' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'password', name: 'password', placeholder: 'Password', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'label', + { htmlFor: 'confirm_password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, + 'Confirm Password' + ), + _react2.default.createElement( + 'div', + { className: 'col-lg-12' }, + _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'confirm_password', name: 'confirm_password', placeholder: 'Confirm Password', required: true }) + ) + ), + _react2.default.createElement( + 'div', + { className: 'form-group' }, + _react2.default.createElement( + 'div', + { className: 'col-lg-10 col-lg-offset-2' }, + _react2.default.createElement( + 'button', + { type: 'submit', className: 'btn btn-primary right', disabled: !this.state.loaded }, + ' ', + _react2.default.createElement('i', { className: 'mdi mdi-account-check' }), + ' Register' + ) + ) + ) + ) + ); + } + }]); + + return _class; + }(_react2.default.Component); + + exports.default = _class; + +/***/ }, /* 412 */ /***/ function(module, exports, __webpack_require__) { @@ -49586,7 +49949,7 @@ var _react2 = _interopRequireDefault(_react); - var _RegisterForm = __webpack_require__(451); + var _RegisterForm = __webpack_require__(411); var _RegisterForm2 = _interopRequireDefault(_RegisterForm); @@ -49700,7 +50063,7 @@ key: 'update', value: function update(content) { var _this = this; - request.put('/api/v1/photos/' + content.get('photo_id') + '/detail/' + content.get('id') + '/', content, function (err, result) { + request.put('/api/v1/photos/' + content.get('photo_id') + '/', content, function (err, result) { _this.emit('updatePhoto', { status: result.status, data: JSON.parse(result.text) }); }); } @@ -49738,7 +50101,7 @@ value: function get(id) { var _this = this; request.get('/api/v1/photos/' + id + '/', function (err, result) { - _this.emit('singlePhoto', { status: result.status, data: JSON.parse(result.text) }); + _this.emit('photo', { status: result.status, data: JSON.parse(result.text) }); }); } }, { @@ -49746,7 +50109,7 @@ value: function getShare(share_id) { var _this = this; request.get('/api/v1/photos/share/?share_id=' + share_id, function (err, result) { - _this.emit('singlePhoto', { status: result.status, data: JSON.parse(result.text) }); + _this.emit('sharePhoto', { status: result.status, data: JSON.parse(result.text) }); }); } }, { @@ -49800,7 +50163,7 @@ var _SideNav2 = _interopRequireDefault(_SideNav); - var _Subnav = __webpack_require__(450); + var _Subnav = __webpack_require__(419); var _Subnav2 = _interopRequireDefault(_Subnav); @@ -49876,7 +50239,96 @@ exports.default = _class; /***/ }, -/* 419 */, +/* 419 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _react = __webpack_require__(1); + + var _react2 = _interopRequireDefault(_react); + + var _FolderStore = __webpack_require__(420); + + var _FolderStore2 = _interopRequireDefault(_FolderStore); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _class = function (_React$Component) { + _inherits(_class, _React$Component); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: 'toggleModal', + value: function toggleModal(e) { + e.preventDefault(); + $('#folder_name').val(''); + $('#formModal .modal-title').html('New Folder'); + $('#folder_id').val(''); + $('#formModal').modal(); + } + }, { + key: 'getUpload', + value: function getUpload(e) { + e.preventDefault(); + var folder_id = $('#active-folder').val(); + document.location.href = "#/upload/" + folder_id; + } + }, { + key: 'render', + value: function render() { + return _react2.default.createElement( + 'section', + null, + _react2.default.createElement( + 'div', + { className: 'row' }, + _react2.default.createElement( + 'div', + { className: 'col-lg-3 col-md-3 col-sm-4' }, + _react2.default.createElement( + 'a', + { href: '#', title: 'New Folder', className: 'btn toolbar', onClick: this.toggleModal }, + _react2.default.createElement('i', { className: 'mdi mdi-folder-plus' }), + _react2.default.createElement('br', null), + 'New Folder' + ), + _react2.default.createElement( + 'a', + { href: '#', title: 'Upload New File', className: 'btn toolbar', onClick: this.getUpload }, + _react2.default.createElement('i', { className: 'mdi mdi-upload' }), + _react2.default.createElement('br', null), + 'Upload Photo' + ) + ) + ) + ); + } + }]); + + return _class; + }(_react2.default.Component); + + exports.default = _class; + +/***/ }, /* 420 */ /***/ function(module, exports, __webpack_require__) { @@ -50058,14 +50510,14 @@ key: 'photoDetail', value: function photoDetail(data) { this.infoElement = _react2.default.createElement(_PhotoInfo2.default, { data: data.data }); - this.setState({ title: data.data.folder_name + ' - ' + data.data.detail.title }); + this.setState({ title: data.data.folder_name + ' - ' + data.data.title }); } }, { key: 'componentWillMount', value: function componentWillMount() { this.state = { title: '' }; _FolderStore2.default.on('singleFolder', this.folderDetail); - _PhotoStore2.default.on('singlePhoto', this.photoDetail); + _PhotoStore2.default.on('photo', this.photoDetail); } }, { key: 'componentWillUnmount', @@ -50391,7 +50843,7 @@ var _react2 = _interopRequireDefault(_react); - var _FolderForm = __webpack_require__(453); + var _FolderForm = __webpack_require__(427); var _FolderForm2 = _interopRequireDefault(_FolderForm); @@ -50429,7 +50881,166 @@ exports.default = _class; /***/ }, -/* 427 */, +/* 427 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _react = __webpack_require__(1); + + var _react2 = _interopRequireDefault(_react); + + var _reactLoader = __webpack_require__(394); + + var _reactLoader2 = _interopRequireDefault(_reactLoader); + + var _GenericAction = __webpack_require__(396); + + var action = _interopRequireWildcard(_GenericAction); + + var _ToastAction = __webpack_require__(401); + + var Toast = _interopRequireWildcard(_ToastAction); + + var _FolderStore = __webpack_require__(420); + + var _FolderStore2 = _interopRequireDefault(_FolderStore); + + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _class = function (_React$Component) { + _inherits(_class, _React$Component); + + function _class() { + _classCallCheck(this, _class); + + var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); + + _this.detail = _this.detail.bind(_this); + _this.complete = _this.complete.bind(_this); + return _this; + } + + _createClass(_class, [{ + key: 'componentWillMount', + value: function componentWillMount() { + this.state = { loaded: true }; + _FolderStore2.default.on('newFolder', this.complete); + _FolderStore2.default.on('singleFolder', this.detail); + } + }, { + key: 'componentWillUnmount', + value: function componentWillUnmount() { + _FolderStore2.default.removeListener('newFolder', this.complete); + _FolderStore2.default.removeListener('singleFolder', this.complete); + } + }, { + key: 'complete', + value: function complete(data) { + this.setState({ loaded: true }); + if (data.status == 201) { + Toast.ok('New folder created'); + $('#formModal').modal('toggle'); + _FolderStore2.default.getAll(); + } else if (data.status == 200) { + Toast.ok('Folder updated'); + $('#formModal').modal('toggle'); + _FolderStore2.default.getAll(); + } else { + Toast.error('Unable to complete request'); + } + document.location.href = '#/'; + } + }, { + key: 'detail', + value: function detail(data) { + if (data.status == 200) { + $('#folder_name').val(data.data.name); + $('#folder_id').val(data.data.id); + } + } + }, { + key: 'onSubmit', + value: function onSubmit(e) { + e.preventDefault(); + var dataArray = $(e.target).serializeArray(); + var form = new FormData(); + dataArray.forEach(function (data) { + form.append(data.name, data.value); + }); + var id = $('#folder_id').val(); + if (id) { + form.append('id', id); + } + + this.setState({ loaded: false }); + var actionType = id ? 'UPDATE_FOLDER' : 'NEW_FOLDER'; + action.perform(form, actionType); + } + }, { + key: 'render', + value: function render() { + + return _react2.default.createElement( + 'div', + { className: 'row' }, + _react2.default.createElement( + 'form', + { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, + _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '73%' }), + _react2.default.createElement( + 'fieldset', + null, + _react2.default.createElement( + 'div', + { className: 'form-group col-md-10' }, + _react2.default.createElement( + 'label', + { className: 'control-label' }, + 'Folder Name' + ), + _react2.default.createElement( + 'div', + { className: 'input-group' }, + _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'folder_name', name: 'name', required: true }), + _react2.default.createElement( + 'span', + { className: 'input-group-btn' }, + _react2.default.createElement( + 'button', + { className: 'btn btn-default', type: 'submit', disabled: !this.state.loaded }, + 'Save' + ) + ) + ) + ) + ) + ), + _react2.default.createElement('input', { type: 'hidden', className: 'form-control', id: 'folder_id', name: 'folder_id' }) + ); + } + }]); + + return _class; + }(_react2.default.Component); + + exports.default = _class; + +/***/ }, /* 428 */ /***/ function(module, exports, __webpack_require__) { @@ -50515,8 +51126,7 @@ }, { key: 'getNext', value: function getNext(data) { - var page = data.selected + 1; - _FolderStore2.default.getAll(page); + _FolderStore2.default.getAll(data.selected + 1); } }, { key: 'complete', @@ -50535,7 +51145,7 @@ var folders = this.state.folders.map(function (item) { return _react2.default.createElement(_FolderThumb2.default, _extends({ key: item.id }, item)); }); - if (!folders.length) { + if (!folders.length && this.state.loaded) { return _react2.default.createElement(_Empty2.default, { title: 'No folder found' }); } var paginate = ''; @@ -50786,6 +51396,7 @@ var name = _props.name; var id = _props.id; var photos = _props.photos; + var pageNum = _props.pageNum; this.id = id; return _react2.default.createElement( @@ -52013,8 +52624,7 @@ _createClass(_class, [{ key: 'getNext', value: function getNext(data) { - var page = data.selected + 1; - _PhotoStore2.default.getAll(page, this.state.folder_id); + _PhotoStore2.default.getAll(data.selected + 1, this.state.folder_id); } }, { key: 'componentWillMount', @@ -52056,9 +52666,10 @@ var photos = this.state.photos.map(function (item) { return _react2.default.createElement(_PhotoThumb2.default, _extends({ key: item.id, folder_id: _this2.state.folder_id }, item)); }); - if (!photos.length) { + if (!photos.length && this.state.loaded) { return _react2.default.createElement(_Empty2.default, { title: 'No image found' }); } + var paginate = ''; if (this.state.next || this.state.previous) { paginate = _react2.default.createElement(_reactPaginate2.default, { pageNum: this.state.count / 8, pageRangeDisplayed: 8, marginPagesDisplayed: 8, containerClassName: "pagination pagination-sm right", clickCallback: this.getNext }); @@ -52102,6 +52713,10 @@ var _react2 = _interopRequireDefault(_react); + var _reactDom = __webpack_require__(38); + + var _reactDom2 = _interopRequireDefault(_reactDom); + var _reactLoader = __webpack_require__(394); var _reactLoader2 = _interopRequireDefault(_reactLoader); @@ -52110,7 +52725,7 @@ var _Options2 = _interopRequireDefault(_Options); - var _ShareButtons = __webpack_require__(454); + var _ShareButtons = __webpack_require__(443); var _ShareButtons2 = _interopRequireDefault(_ShareButtons); @@ -52211,9 +52826,11 @@ var image = _props.image; var id = _props.id; var share_code = _props.share_code; - var detail = _props.detail; + var title = _props.title; + var page = _props.page; this.id = id; + var image_src = edited_image ? edited_image + "?" + new Date().getTime() : image; var share_link = document.location.protocol + '//' + document.location.host + '/#/share/' + share_code; return _react2.default.createElement( 'div', @@ -52228,8 +52845,8 @@ { className: 'crop' }, _react2.default.createElement( 'a', - { href: edited_image ? edited_image + "?" + new Date().getTime() : image, className: 'preview', title: detail.title }, - _react2.default.createElement('img', { src: edited_image ? edited_image + "?" + new Date().getTime() : image, alt: detail.title }) + { href: image_src, className: 'preview', title: title }, + _react2.default.createElement('img', { src: image_src, alt: title }) ) ), _react2.default.createElement( @@ -52238,7 +52855,7 @@ _react2.default.createElement( 'h5', null, - detail.title.length ? detail.title : 'Untiltled', + title ? title : 'Untitled', ' ', _react2.default.createElement(_ShareButtons2.default, { share_link: share_link }) ) @@ -52255,6 +52872,102 @@ /***/ }, /* 443 */ +/***/ function(module, exports, __webpack_require__) { + + "use strict"; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + + var _react = __webpack_require__(1); + + var _react2 = _interopRequireDefault(_react); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + + function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + + var _class = function (_React$Component) { + _inherits(_class, _React$Component); + + function _class() { + _classCallCheck(this, _class); + + return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); + } + + _createClass(_class, [{ + key: "render", + value: function render() { + var share_link = this.props.share_link; + + var link = encodeURIComponent(share_link); + return _react2.default.createElement( + "div", + { className: "share right" }, + _react2.default.createElement( + "div", + { className: "btn-group" }, + _react2.default.createElement( + "a", + { href: "#", className: "dropdown-toggle", "data-toggle": "dropdown", title: "Share" }, + " ", + _react2.default.createElement("i", { className: "mdi mdi-share-variant" }), + " " + ), + _react2.default.createElement( + "ul", + { className: "dropdown-menu dropdown-menu-left" }, + _react2.default.createElement( + "li", + null, + _react2.default.createElement( + "a", + { href: "https://www.facebook.com/sharer/sharer.php?u=" + link, target: "_blank" }, + _react2.default.createElement("i", { className: "mdi mdi-facebook" }), + " Facebook" + ) + ), + _react2.default.createElement( + "li", + null, + _react2.default.createElement( + "a", + { href: "https://twitter.com/intent/tweet?text=" + link, target: "_blank" }, + _react2.default.createElement("i", { className: "mdi mdi-twitter" }), + " Twitter" + ) + ), + _react2.default.createElement( + "li", + null, + _react2.default.createElement( + "a", + { href: "https://plus.google.com/share?url=" + link, target: "_blank" }, + _react2.default.createElement("i", { className: "mdi mdi-google-plus" }), + " Google" + ) + ) + ) + ) + ); + } + }]); + + return _class; + }(_react2.default.Component); + + exports.default = _class; + +/***/ }, +/* 444 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -52281,11 +52994,11 @@ var Toast = _interopRequireWildcard(_ToastAction); - var _Effects = __webpack_require__(444); + var _Effects = __webpack_require__(445); var _Effects2 = _interopRequireDefault(_Effects); - var _ShareButtons = __webpack_require__(454); + var _ShareButtons = __webpack_require__(443); var _ShareButtons2 = _interopRequireDefault(_ShareButtons); @@ -52321,10 +53034,10 @@ var id = this.props.params.id; this.id = id; - _PhotoStore2.default.get(id); _PhotoStore2.default.on('updatePhoto', this.updateComplete); _PhotoStore2.default.on('previewPhoto', this.previewComplete); - _PhotoStore2.default.on('singlePhoto', this.detail); + _PhotoStore2.default.on('photo', this.detail); + _PhotoStore2.default.get(id); } }, { key: 'componentDidMount', @@ -52350,14 +53063,14 @@ value: function componentWillUnmount() { _PhotoStore2.default.removeListener('updatePhoto', this.updateComplete); _PhotoStore2.default.removeListener('previewPhoto', this.previewComplete); - _PhotoStore2.default.removeListener('singlePhoto', this.detail); + _PhotoStore2.default.removeListener('photo', this.detail); } }, { key: 'detail', value: function detail(result) { if (result.status == 200) { - var title = result.data.detail ? result.data.detail.title : ''; - var effects = result.data.detail.effects ? this.decodeEffects(result.data.detail.effects) : this.defaultEffects; + var title = result.data.title; + var effects = result.data.effects ? this.decodeEffects(result.data.effects) : this.defaultEffects; this.setState({ file: result.data, loaded: true, effects: effects }); $('#title').val(title); } @@ -52447,7 +53160,7 @@ value: function getFormData() { var form = new FormData(); form.append('photo_id', this.id); - form.append('id', this.state.file.detail.id ? this.state.file.detail.id : 0); + form.append('id', this.state.file.id ? this.state.file.id : 0); form.append('effects', JSON.stringify(this.state.effects)); form.append('title', $('#title').val()); return form; @@ -52464,6 +53177,7 @@ key: 'render', value: function render() { var share_link = document.location.protocol + '//' + document.location.host + '/#/share/' + this.state.file.share_code; + var image_src = this.state.file.edited_image ? this.state.file.edited_image : this.state.file.image; return _react2.default.createElement( 'div', { className: 'col-md-12' }, @@ -52495,8 +53209,8 @@ _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '50%', left: '50%' }), _react2.default.createElement( 'a', - { href: this.state.file.edited_image ? this.state.file.edited_image : this.state.file.image, className: 'preview', title: 'Zoom' }, - _react2.default.createElement('img', { src: this.state.file.edited_image ? this.state.file.edited_image : this.state.file.image, className: 'img-responsive' }) + { href: image_src, className: 'preview', title: 'Zoom' }, + _react2.default.createElement('img', { src: image_src, className: 'img-responsive' }) ) ) ), @@ -52511,7 +53225,7 @@ { className: 'control-label', htmlFor: 'title' }, 'Title' ), - _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'title', defaultValue: this.state.file.image }) + _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'title' }) ), _react2.default.createElement( 'div', @@ -52536,7 +53250,7 @@ exports.default = _class; /***/ }, -/* 444 */ +/* 445 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -52551,11 +53265,11 @@ var _react2 = _interopRequireDefault(_react); - var _RangeField = __webpack_require__(445); + var _RangeField = __webpack_require__(446); var _RangeField2 = _interopRequireDefault(_RangeField); - var _CheckboxField = __webpack_require__(446); + var _CheckboxField = __webpack_require__(447); var _CheckboxField2 = _interopRequireDefault(_CheckboxField); @@ -52694,7 +53408,7 @@ exports.default = _class; /***/ }, -/* 445 */ +/* 446 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -52767,7 +53481,7 @@ exports.default = _class; /***/ }, -/* 446 */ +/* 447 */ /***/ function(module, exports, __webpack_require__) { "use strict"; @@ -52838,7 +53552,6 @@ exports.default = _class; /***/ }, -/* 447 */, /* 448 */ /***/ function(module, exports, __webpack_require__) { @@ -52940,716 +53653,5 @@ exports.default = _class; -/***/ }, -/* 450 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _react = __webpack_require__(1); - - var _react2 = _interopRequireDefault(_react); - - var _FolderStore = __webpack_require__(420); - - var _FolderStore2 = _interopRequireDefault(_FolderStore); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _class = function (_React$Component) { - _inherits(_class, _React$Component); - - function _class() { - _classCallCheck(this, _class); - - return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); - } - - _createClass(_class, [{ - key: 'toggleModal', - value: function toggleModal(e) { - e.preventDefault(); - $('#folder_name').val(''); - $('#formModal .modal-title').html('New Folder'); - $('#folder_id').val(''); - $('#formModal').modal(); - } - }, { - key: 'getUpload', - value: function getUpload(e) { - e.preventDefault(); - var folder_id = $('#active-folder').val(); - document.location.href = "#/upload/" + folder_id; - } - }, { - key: 'render', - value: function render() { - return _react2.default.createElement( - 'section', - null, - _react2.default.createElement( - 'div', - { className: 'row' }, - _react2.default.createElement( - 'div', - { className: 'col-lg-3 col-md-3 col-sm-4' }, - _react2.default.createElement( - 'a', - { href: '#', title: 'New Folder', className: 'btn toolbar', onClick: this.toggleModal }, - _react2.default.createElement('i', { className: 'mdi mdi-folder-plus' }), - _react2.default.createElement('br', null), - 'New Folder' - ), - _react2.default.createElement( - 'a', - { href: '#', title: 'Upload New File', className: 'btn toolbar', onClick: this.getUpload }, - _react2.default.createElement('i', { className: 'mdi mdi-upload' }), - _react2.default.createElement('br', null), - 'Upload Photo' - ) - ) - ) - ); - } - }]); - - return _class; - }(_react2.default.Component); - - exports.default = _class; - -/***/ }, -/* 451 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _react = __webpack_require__(1); - - var _react2 = _interopRequireDefault(_react); - - var _reactLoader = __webpack_require__(394); - - var _reactLoader2 = _interopRequireDefault(_reactLoader); - - var _RegisterStore = __webpack_require__(412); - - var _RegisterStore2 = _interopRequireDefault(_RegisterStore); - - var _LoginStore = __webpack_require__(402); - - var _LoginStore2 = _interopRequireDefault(_LoginStore); - - var _GenericAction = __webpack_require__(396); - - var action = _interopRequireWildcard(_GenericAction); - - var _ToastAction = __webpack_require__(401); - - var Toast = _interopRequireWildcard(_ToastAction); - - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _class = function (_React$Component) { - _inherits(_class, _React$Component); - - function _class() { - _classCallCheck(this, _class); - - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); - - _this.loginComplete = _this.loginComplete.bind(_this); - _this.registerComplete = _this.registerComplete.bind(_this); - return _this; - } - - _createClass(_class, [{ - key: 'componentWillMount', - value: function componentWillMount() { - this.state = { loaded: true, user: {} }; - _RegisterStore2.default.on('registerComplete', this.registerComplete); - _LoginStore2.default.on('loginComplete', this.loginComplete); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - _RegisterStore2.default.removeListener('registerComplete', this.registerComplete); - _LoginStore2.default.removeListener('loginComplete', this.loginComplete); - } - }, { - key: 'login', - value: function login(username, password) { - var form = new FormData(); - form.append('username', username); - form.append('password', password); - action.perform(form, 'LOGIN'); - } - }, { - key: 'registerComplete', - value: function registerComplete(data) { - this.setState({ loaded: true }); - if (data.status != 201) { - Toast.error(data.data.username[0]); - } else { - Toast.ok('Account created'); - this.login(this.state.user.username, this.state.user.password); - } - } - }, { - key: 'loginComplete', - value: function loginComplete(data) { - this.setState({ loaded: true }); - if (!data.data.login) { - Toast.error(data.data.message); - } else { - Toast.ok('Login Successful'); - document.location.href = '/'; - } - } - }, { - key: 'onSubmit', - value: function onSubmit(e) { - e.preventDefault(); - var dataArray = $(e.target).serializeArray(); - var dataObject = {}; - dataArray.forEach(function (data) { - dataObject[data.name] = data.value; - }); - this.setState({ user: dataObject }); - if (dataObject.password != dataObject.confirm_password) { - Toast.error('Password Mismatch'); - return false; - } - this.setState({ loaded: false }); - action.perform(dataObject, 'NEW_REGISTER'); - } - }, { - key: 'render', - value: function render() { - var label = this.props.label; - - return _react2.default.createElement( - 'form', - { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, - _react2.default.createElement( - 'fieldset', - null, - _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '73%' }), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { htmlFor: 'username', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Username' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'username', placeholder: 'Username', name: 'username', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { htmlFor: 'email', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Email' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'email', className: 'form-control', id: 'email', name: 'email', placeholder: 'Email', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { htmlFor: 'password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Password' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'password', name: 'password', placeholder: 'Password', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { htmlFor: 'confirm_password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Confirm Password' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'confirm_password', name: 'confirm_password', placeholder: 'Confirm Password', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'div', - { className: 'col-lg-10 col-lg-offset-2' }, - _react2.default.createElement( - 'button', - { type: 'submit', className: 'btn btn-primary right', disabled: !this.state.loaded }, - ' ', - _react2.default.createElement('i', { className: 'mdi mdi-account-check' }), - ' Register' - ) - ) - ) - ) - ); - } - }]); - - return _class; - }(_react2.default.Component); - - exports.default = _class; - -/***/ }, -/* 452 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _react = __webpack_require__(1); - - var _react2 = _interopRequireDefault(_react); - - var _reactLoader = __webpack_require__(394); - - var _reactLoader2 = _interopRequireDefault(_reactLoader); - - var _GenericAction = __webpack_require__(396); - - var action = _interopRequireWildcard(_GenericAction); - - var _ToastAction = __webpack_require__(401); - - var Toast = _interopRequireWildcard(_ToastAction); - - var _LoginStore = __webpack_require__(402); - - var _LoginStore2 = _interopRequireDefault(_LoginStore); - - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _class = function (_React$Component) { - _inherits(_class, _React$Component); - - function _class() { - _classCallCheck(this, _class); - - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); - - _this.loginComplete = _this.loginComplete.bind(_this); - return _this; - } - - _createClass(_class, [{ - key: 'componentWillMount', - value: function componentWillMount() { - this.state = { loaded: true }; - _LoginStore2.default.on('loginComplete', this.loginComplete); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - _LoginStore2.default.removeListener('loginComplete', this.loginComplete); - } - }, { - key: 'loginComplete', - value: function loginComplete(data) { - this.setState({ loaded: true }); - if (!data.data.login) { - Toast.error(data.data.message); - } else { - Toast.ok('Login Successful'); - document.location.href = '/'; - } - } - }, { - key: 'onSubmit', - value: function onSubmit(e) { - e.preventDefault(); - var dataArray = $(e.target).serializeArray(); - var form = new FormData(); - dataArray.forEach(function (data) { - form.append(data.name, data.value); - }); - this.setState({ loaded: false }); - action.perform(form, 'LOGIN'); - } - }, { - key: 'render', - value: function render() { - var label = this.props.label; - - return _react2.default.createElement( - 'form', - { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, - _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '50%' }), - _react2.default.createElement( - 'fieldset', - null, - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Username' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'text', className: 'form-control', placeholder: 'Username', name: 'username', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'label', - { htmlFor: 'password', className: 'col-lg-2 control-label', style: { display: label ? "block" : 'none' } }, - 'Password' - ), - _react2.default.createElement( - 'div', - { className: 'col-lg-12' }, - _react2.default.createElement('input', { type: 'password', className: 'form-control', id: 'password', name: 'password', placeholder: 'Password', required: true }) - ) - ), - _react2.default.createElement( - 'div', - { className: 'form-group' }, - _react2.default.createElement( - 'div', - { className: 'col-lg-10 col-lg-offset-2' }, - _react2.default.createElement( - 'button', - { type: 'submit', className: 'btn btn-primary right', disabled: !this.state.loaded }, - ' ', - _react2.default.createElement('i', { className: 'mdi mdi-login-variant' }), - ' Login' - ) - ) - ) - ) - ); - } - }]); - - return _class; - }(_react2.default.Component); - - exports.default = _class; - -/***/ }, -/* 453 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _react = __webpack_require__(1); - - var _react2 = _interopRequireDefault(_react); - - var _reactLoader = __webpack_require__(394); - - var _reactLoader2 = _interopRequireDefault(_reactLoader); - - var _GenericAction = __webpack_require__(396); - - var action = _interopRequireWildcard(_GenericAction); - - var _ToastAction = __webpack_require__(401); - - var Toast = _interopRequireWildcard(_ToastAction); - - var _FolderStore = __webpack_require__(420); - - var _FolderStore2 = _interopRequireDefault(_FolderStore); - - function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _class = function (_React$Component) { - _inherits(_class, _React$Component); - - function _class() { - _classCallCheck(this, _class); - - var _this = _possibleConstructorReturn(this, Object.getPrototypeOf(_class).call(this)); - - _this.detail = _this.detail.bind(_this); - _this.complete = _this.complete.bind(_this); - return _this; - } - - _createClass(_class, [{ - key: 'componentWillMount', - value: function componentWillMount() { - this.state = { loaded: true }; - _FolderStore2.default.on('newFolder', this.complete); - _FolderStore2.default.on('singleFolder', this.detail); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - _FolderStore2.default.removeListener('newFolder', this.complete); - _FolderStore2.default.removeListener('singleFolder', this.complete); - } - }, { - key: 'complete', - value: function complete(data) { - this.setState({ loaded: true }); - if (data.status == 201) { - Toast.ok('New folder created'); - $('#formModal').modal('toggle'); - _FolderStore2.default.getAll(); - } else if (data.status == 200) { - Toast.ok('Folder updated'); - $('#formModal').modal('toggle'); - _FolderStore2.default.getAll(); - } else { - Toast.error('Unable to complete request'); - } - document.location.href = '#/'; - } - }, { - key: 'detail', - value: function detail(data) { - if (data.status == 200) { - $('#folder_name').val(data.data.name); - $('#folder_id').val(data.data.id); - } - } - }, { - key: 'onSubmit', - value: function onSubmit(e) { - e.preventDefault(); - var dataArray = $(e.target).serializeArray(); - var form = new FormData(); - dataArray.forEach(function (data) { - form.append(data.name, data.value); - }); - var id = $('#folder_id').val(); - if (id) { - form.append('id', id); - } - - this.setState({ loaded: false }); - var actionType = id ? 'UPDATE_FOLDER' : 'NEW_FOLDER'; - action.perform(form, actionType); - } - }, { - key: 'render', - value: function render() { - - return _react2.default.createElement( - 'div', - { className: 'row' }, - _react2.default.createElement( - 'form', - { className: 'form-horizontal', method: 'post', onSubmit: this.onSubmit.bind(this) }, - _react2.default.createElement(_reactLoader2.default, { loaded: this.state.loaded, top: '73%' }), - _react2.default.createElement( - 'fieldset', - null, - _react2.default.createElement( - 'div', - { className: 'form-group col-md-10' }, - _react2.default.createElement( - 'label', - { className: 'control-label' }, - 'Folder Name' - ), - _react2.default.createElement( - 'div', - { className: 'input-group' }, - _react2.default.createElement('input', { type: 'text', className: 'form-control', id: 'folder_name', name: 'name', required: true }), - _react2.default.createElement( - 'span', - { className: 'input-group-btn' }, - _react2.default.createElement( - 'button', - { className: 'btn btn-default', type: 'submit', disabled: !this.state.loaded }, - 'Save' - ) - ) - ) - ) - ) - ), - _react2.default.createElement('input', { type: 'hidden', className: 'form-control', id: 'folder_id', name: 'folder_id' }) - ); - } - }]); - - return _class; - }(_react2.default.Component); - - exports.default = _class; - -/***/ }, -/* 454 */ -/***/ function(module, exports, __webpack_require__) { - - "use strict"; - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _react = __webpack_require__(1); - - var _react2 = _interopRequireDefault(_react); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - - function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - - var _class = function (_React$Component) { - _inherits(_class, _React$Component); - - function _class() { - _classCallCheck(this, _class); - - return _possibleConstructorReturn(this, Object.getPrototypeOf(_class).apply(this, arguments)); - } - - _createClass(_class, [{ - key: "render", - value: function render() { - var share_link = this.props.share_link; - - var link = encodeURIComponent(share_link); - return _react2.default.createElement( - "div", - { className: "share right" }, - _react2.default.createElement( - "div", - { className: "btn-group" }, - _react2.default.createElement( - "a", - { href: "#", className: "dropdown-toggle", "data-toggle": "dropdown", title: "Share" }, - " ", - _react2.default.createElement("i", { className: "mdi mdi-share-variant" }), - " " - ), - _react2.default.createElement( - "ul", - { className: "dropdown-menu dropdown-menu-left" }, - _react2.default.createElement( - "li", - null, - _react2.default.createElement( - "a", - { href: "https://www.facebook.com/sharer/sharer.php?u=" + link, target: "_blank" }, - _react2.default.createElement("i", { className: "mdi mdi-facebook" }), - " Facebook" - ) - ), - _react2.default.createElement( - "li", - null, - _react2.default.createElement( - "a", - { href: "https://twitter.com/intent/tweet?text=" + link, target: "_blank" }, - _react2.default.createElement("i", { className: "mdi mdi-twitter" }), - " Twitter" - ) - ), - _react2.default.createElement( - "li", - null, - _react2.default.createElement( - "a", - { href: "https://plus.google.com/share?url=" + link, target: "_blank" }, - _react2.default.createElement("i", { className: "mdi mdi-google-plus" }), - " Google" - ) - ) - ) - ) - ); - } - }]); - - return _class; - }(_react2.default.Component); - - exports.default = _class; - /***/ } /******/ ]); \ No newline at end of file diff --git a/app/static/components/DetailModal.jsx b/app/static/components/DetailModal.jsx index 0ff168b..a1e9ed5 100644 --- a/app/static/components/DetailModal.jsx +++ b/app/static/components/DetailModal.jsx @@ -19,13 +19,13 @@ export default class extends React.Component { photoDetail(data){ this.infoElement = ; - this.setState({title: data.data.folder_name + ' - ' + data.data.detail.title}); + this.setState({title: data.data.folder_name + ' - ' + data.data.title}); } componentWillMount(){ this.state = {title:''}; storeFolder.on('singleFolder', this.folderDetail); - storePhoto.on('singlePhoto', this.photoDetail); + storePhoto.on('photo', this.photoDetail); } componentWillUnmount(){ diff --git a/app/static/components/EditImage.jsx b/app/static/components/EditImage.jsx index 2b9ff2c..7f8c99a 100644 --- a/app/static/components/EditImage.jsx +++ b/app/static/components/EditImage.jsx @@ -18,10 +18,10 @@ export default class extends React.Component { this.state = {loaded: false, file:{}, effects:this.defaultEffects}; const {id} = this.props.params; this.id = id; - storePhoto.get(id); storePhoto.on('updatePhoto', this.updateComplete); storePhoto.on('previewPhoto', this.previewComplete); - storePhoto.on('singlePhoto', this.detail); + storePhoto.on('photo', this.detail); + storePhoto.get(id); } componentDidMount(){ @@ -45,13 +45,13 @@ export default class extends React.Component { componentWillUnmount(){ storePhoto.removeListener('updatePhoto', this.updateComplete); storePhoto.removeListener('previewPhoto', this.previewComplete); - storePhoto.removeListener('singlePhoto', this.detail); + storePhoto.removeListener('photo', this.detail); } detail(result){ if(result.status == 200){ - var title = result.data.detail ? result.data.detail.title : '' - var effects = result.data.detail.effects ? this.decodeEffects(result.data.detail.effects) : this.defaultEffects; + var title = result.data.title; + var effects = result.data.effects ? this.decodeEffects(result.data.effects) : this.defaultEffects; this.setState({file: result.data, loaded: true, effects: effects}); $('#title').val(title); } @@ -131,7 +131,7 @@ export default class extends React.Component { getFormData(){ var form = new FormData(); form.append('photo_id', this.id); - form.append('id', this.state.file.detail.id ? this.state.file.detail.id : 0); + form.append('id', this.state.file.id ? this.state.file.id : 0); form.append('effects', JSON.stringify(this.state.effects)); form.append('title', $('#title').val()); return form; @@ -146,6 +146,7 @@ export default class extends React.Component { render() { const share_link = document.location.protocol + '//' + document.location.host + '/#/share/' + this.state.file.share_code; + var image_src = this.state.file.edited_image ? this.state.file.edited_image : this.state.file.image; return (

Image Preview

@@ -160,15 +161,15 @@ export default class extends React.Component {
- - + +
- +
diff --git a/app/static/components/FolderThumb.jsx b/app/static/components/FolderThumb.jsx index c5c74ce..ab2ff7a 100644 --- a/app/static/components/FolderThumb.jsx +++ b/app/static/components/FolderThumb.jsx @@ -39,7 +39,7 @@ export default class extends React.Component { } render() { - var {name, id, photos} = this.props; + var {name, id, photos, pageNum} = this.props; this.id = id; return (
diff --git a/app/static/components/Folders.jsx b/app/static/components/Folders.jsx index 8c080fe..879f407 100644 --- a/app/static/components/Folders.jsx +++ b/app/static/components/Folders.jsx @@ -27,8 +27,7 @@ export default class extends React.Component { } getNext(data){ - var page = data.selected + 1; - store.getAll(page); + store.getAll(data.selected + 1); } complete(data){ @@ -43,7 +42,7 @@ export default class extends React.Component { render() { const folders = this.state.folders.map((item) => { return }); - if(!folders.length){ + if(!folders.length && this.state.loaded){ return ( ) diff --git a/app/static/components/PhotoThumb.jsx b/app/static/components/PhotoThumb.jsx index 4e6ada9..58f4504 100644 --- a/app/static/components/PhotoThumb.jsx +++ b/app/static/components/PhotoThumb.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import ReactDOM from 'react-dom'; import Loader from 'react-loader'; import Options from './Options'; import ShareButtons from './ShareButtons'; @@ -66,8 +67,9 @@ export default class extends React.Component { } render() { - var {edited_image, image, id, share_code, detail} = this.props; + var {edited_image, image, id, share_code, title, page} = this.props; this.id = id; + var image_src = edited_image ? edited_image + "?" + (new Date().getTime()) : image; const share_link = document.location.protocol + '//' + document.location.host + '/#/share/' + share_code; return (
@@ -75,12 +77,12 @@ export default class extends React.Component {
-
{detail.title.length ? detail.title : 'Untiltled'}
+
{ title ? title : 'Untitled' }
diff --git a/app/static/components/Photos.jsx b/app/static/components/Photos.jsx index 4c4890e..b49cd1f 100644 --- a/app/static/components/Photos.jsx +++ b/app/static/components/Photos.jsx @@ -13,8 +13,7 @@ export default class extends React.Component { } getNext(data){ - var page = data.selected + 1; - store.getAll(page, this.state.folder_id); + store.getAll(data.selected + 1, this.state.folder_id); } componentWillMount(){ @@ -46,12 +45,13 @@ export default class extends React.Component { } render() { - const photos = this.state.photos.map((item) => { return }); - if(!photos.length){ + const photos = this.state.photos.map((item) => { return }); + if(!photos.length && this.state.loaded){ return ( ) } + var paginate = ''; if(this.state.next || this.state.previous){ paginate = ; diff --git a/app/static/components/store/PhotoStore.jsx b/app/static/components/store/PhotoStore.jsx index ccaa607..69d9339 100644 --- a/app/static/components/store/PhotoStore.jsx +++ b/app/static/components/store/PhotoStore.jsx @@ -12,7 +12,7 @@ class PhotoStore extends EventEmitter { update(content){ var _this = this; - request.put('/api/v1/photos/' + content.get('photo_id') + '/detail/' + content.get('id') + '/', content, (err, result) => { + request.put('/api/v1/photos/' + content.get('photo_id') + '/', content, (err, result) => { _this.emit('updatePhoto', {status: result.status, data: JSON.parse(result.text) }); }); } @@ -47,14 +47,14 @@ class PhotoStore extends EventEmitter { get(id){ var _this = this; request.get('/api/v1/photos/' + id + '/', (err, result) => { - _this.emit('singlePhoto', {status: result.status, data: JSON.parse(result.text) }); + _this.emit('photo', {status: result.status, data: JSON.parse(result.text) }); }); } getShare(share_id){ var _this = this; request.get('/api/v1/photos/share/?share_id=' + share_id, (err, result) => { - _this.emit('singlePhoto', {status: result.status, data: JSON.parse(result.text) }); + _this.emit('sharePhoto', {status: result.status, data: JSON.parse(result.text) }); }); }