hoodcms 5.0.7 → 5.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/js/admin.js +5 -5
  2. package/dist/js/app.js +2 -3
  3. package/dist/js/core/Alerts.d.ts +22 -0
  4. package/dist/js/core/Alerts.js +151 -0
  5. package/dist/js/core/BaseSite.d.ts +6 -0
  6. package/dist/js/core/BaseSite.js +14 -0
  7. package/dist/js/core/ColorPicker.d.ts +5 -0
  8. package/dist/js/core/ColorPicker.js +71 -0
  9. package/dist/js/core/DataList.d.ts +35 -0
  10. package/dist/js/core/DataList.js +56 -0
  11. package/dist/js/core/Editors.d.ts +16 -0
  12. package/dist/js/core/Editors.js +137 -0
  13. package/dist/js/core/Handlers.d.ts +47 -0
  14. package/dist/js/core/Handlers.js +160 -0
  15. package/dist/js/core/HoodApi.d.ts +25 -0
  16. package/dist/js/core/HoodApi.js +22 -0
  17. package/dist/js/core/Inline.d.ts +27 -0
  18. package/dist/js/core/Inline.js +63 -0
  19. package/dist/js/core/Loader.d.ts +5 -0
  20. package/dist/js/core/Loader.js +13 -0
  21. package/dist/js/core/Media.d.ts +113 -0
  22. package/dist/js/core/Media.js +363 -0
  23. package/dist/js/core/Modal.d.ts +35 -0
  24. package/dist/js/core/Modal.js +69 -0
  25. package/dist/js/core/RandomStringGenerator.d.ts +11 -0
  26. package/dist/js/core/RandomStringGenerator.js +23 -0
  27. package/dist/js/core/Response.d.ts +20 -0
  28. package/dist/js/core/Response.js +13 -0
  29. package/dist/js/core/Uploader.d.ts +7 -0
  30. package/dist/js/core/Uploader.js +134 -0
  31. package/dist/js/core/Validator.d.ts +27 -0
  32. package/dist/js/core/Validator.js +80 -0
  33. package/dist/js/extensions/jqueryExtensions.d.ts +11 -0
  34. package/dist/js/extensions/jqueryExtensions.js +99 -0
  35. package/dist/js/extensions/numberExtensions.d.ts +8 -0
  36. package/dist/js/extensions/numberExtensions.js +19 -0
  37. package/dist/js/extensions/stringExtensions.d.ts +12 -0
  38. package/dist/js/extensions/stringExtensions.js +49 -0
  39. package/dist/js/index.d.ts +22 -0
  40. package/dist/js/index.js +22 -0
  41. package/dist/js/interfaces/KeyValue.d.ts +4 -0
  42. package/dist/js/interfaces/KeyValue.js +1 -0
  43. package/dist/js/login.js +1 -1
  44. package/dist/js/models/Content.d.ts +50 -0
  45. package/dist/js/models/Content.js +1 -0
  46. package/dist/js/models/Property.d.ts +9 -0
  47. package/dist/js/models/Property.js +2 -0
  48. package/dist/js/models/Users.d.ts +7 -0
  49. package/dist/js/models/Users.js +2 -0
  50. package/package.json +5 -2
  51. package/src/css/admin.css.map +1 -1
  52. package/src/css/editor.css.map +1 -1
  53. package/src/css/login.css.map +1 -1
  54. package/src/js/admin.js +231 -221
  55. package/src/js/admin.js.map +1 -1
  56. package/src/js/app.js +1 -172
  57. package/src/js/app.js.map +1 -1
  58. package/src/js/login.js +1 -1
  59. package/src/scss/admin.scss +2 -6
  60. package/src/scss/editor.scss +2 -3
  61. package/src/scss/login.scss +2 -16
  62. package/src/ts/admin.ts +2 -6
  63. package/src/ts/app.ts +0 -2
  64. package/src/ts/core/BaseSite.ts +21 -0
  65. package/src/ts/index.ts +25 -0
  66. package/src/ts/hood.ts +0 -5
@@ -0,0 +1,160 @@
1
+ export class Handlers {
2
+ constructor() {
3
+ }
4
+ /**
5
+ * Initialise all default Hood CMS handlers.
6
+ */
7
+ initDefaultHandlers() {
8
+ this.checkboxToCsvInput();
9
+ this.iconSelector();
10
+ this.initSelectValues();
11
+ this.scrollHandlers();
12
+ this.selectText();
13
+ this.setValueOnClick();
14
+ this.submitOnChange();
15
+ }
16
+ /**
17
+ * Sets values of any selects that have the value set in data-selected, useful for
18
+ */
19
+ initSelectValues(tag = 'body') {
20
+ $(tag).find('select[data-selected]').each(this.initSelectValuesHandler);
21
+ }
22
+ initSelectValuesHandler(index, element) {
23
+ let sel = $(this).data('selected');
24
+ if (sel !== 'undefined' && sel !== '') {
25
+ let selected = String(sel);
26
+ $(this).val(selected);
27
+ }
28
+ }
29
+ /**
30
+ * Sets up any Hood Icon selector fields, requires the correct HTML setup.
31
+ */
32
+ iconSelector(tag = 'body') {
33
+ $(tag).find('[data-hood-icon]').each(this.iconSelectorHandler);
34
+ }
35
+ iconSelectorHandler(index, element) {
36
+ let $tag = $(this);
37
+ let input = $tag.find('input[data-hood-icon-input]');
38
+ let display = $tag.find('[data-hood-icon-display]');
39
+ let collapse = $tag.find('.collapse');
40
+ $tag.find('[data-hood-icon-key][data-hood-icon-value]').on('click', function () {
41
+ $tag.find('[data-hood-icon-key][data-hood-icon-value]').removeClass('active');
42
+ $(this).addClass('active');
43
+ let key = $(this).data('hoodIconKey');
44
+ let value = $(this).data('hoodIconValue');
45
+ $(this);
46
+ display.html(value);
47
+ input.val(key);
48
+ if (collapse) {
49
+ collapse.removeClass('show');
50
+ }
51
+ });
52
+ }
53
+ /**
54
+ * Submits the form when input is changed, mark inputs with .submit-on-change class.
55
+ */
56
+ selectText(tag = 'body') {
57
+ $(tag).on('click', '.select-text', this.selectTextHandler);
58
+ }
59
+ selectTextHandler() {
60
+ let $this = $(this);
61
+ $this.select();
62
+ // Work around Chrome's little problem
63
+ $this.mouseup(function () {
64
+ // Prevent further mouseup intervention
65
+ $this.unbind("mouseup");
66
+ return false;
67
+ });
68
+ }
69
+ /**
70
+ * Attaches handlers for default scrolling functions, scroll to top, scroll to target (with header.header offset calculated)
71
+ * and scroll to target direct (with no calculated offset).
72
+ */
73
+ scrollHandlers(tag = 'body') {
74
+ $(tag).on('click', '.scroll-top, .scroll-to-top', this.scrollTop);
75
+ $(tag).on('click', '.scroll-target, .scroll-to-target', this.scrollTarget);
76
+ $(tag).on('click', '.scroll-target-direct, .scroll-to-target-direct', this.scrollTargetDirect);
77
+ }
78
+ scrollTop(e) {
79
+ if (e)
80
+ e.preventDefault();
81
+ $('html, body').animate({ scrollTop: 0 }, 800);
82
+ return false;
83
+ }
84
+ scrollTarget(e) {
85
+ if (e)
86
+ e.preventDefault();
87
+ let url = $(this).attr('href').split('#')[0];
88
+ if (url !== window.location.pathname && url !== "") {
89
+ return;
90
+ }
91
+ let target = this.hash;
92
+ let $target = $(target);
93
+ let $header = $('header.header');
94
+ let headerOffset = 0;
95
+ if ($header) {
96
+ headerOffset = $header.height();
97
+ }
98
+ if ($(this).data('offset'))
99
+ $('html, body').stop().animate({
100
+ 'scrollTop': $target.offset().top - $(this).data('offset')
101
+ }, 900, 'swing');
102
+ else
103
+ $('html, body').stop().animate({
104
+ 'scrollTop': $target.offset().top - headerOffset
105
+ }, 900, 'swing');
106
+ }
107
+ scrollTargetDirect() {
108
+ let scrollTop = $('body').scrollTop();
109
+ let top = $($(this).attr('href')).offset().top;
110
+ $('html, body').animate({
111
+ scrollTop: top
112
+ }, Math.abs(top - scrollTop));
113
+ return false;
114
+ }
115
+ /**
116
+ * Compiles any selected checkboxes with matching data-hood-csv-input tags,
117
+ * then saves the CSV list of the values to the input given in the tag.
118
+ */
119
+ checkboxToCsvInput(tag = 'body') {
120
+ $(tag).on('change', 'input[type=checkbox][data-hood-csv-input]', this.checkboxToCsvInputHandler);
121
+ }
122
+ checkboxToCsvInputHandler(e) {
123
+ if (e)
124
+ e.preventDefault();
125
+ // when i change - create an array, with any other checked of the same data-input checkboxes. and add to the data-input referenced tag.
126
+ let items = new Array();
127
+ $('input[data-hood-csv-input="' + $(this).data('hoodCsvInput') + '"]').each(function () {
128
+ if ($(this).is(":checked"))
129
+ items.push($(this).val());
130
+ });
131
+ let id = '#' + $(this).data('input');
132
+ let vals = JSON.stringify(items);
133
+ $(id).val(vals);
134
+ }
135
+ /**
136
+ * Submits the form when input is changed, mark inputs with .submit-on-change class.
137
+ */
138
+ submitOnChange(tag = 'body') {
139
+ $(tag).on('change', '.submit-on-change', this.submitOnChangeHandler);
140
+ }
141
+ submitOnChangeHandler(e) {
142
+ if (e)
143
+ e.preventDefault();
144
+ $(this).parents('form').submit();
145
+ }
146
+ /**
147
+ * Sets the value of the input [data-target] when clicked to the value in [data-value]
148
+ */
149
+ setValueOnClick(tag = 'body') {
150
+ $(tag).on('click', '.click-select[data-target][data-value]', this.setValueOnClickHandler);
151
+ }
152
+ setValueOnClickHandler() {
153
+ let $this = $(this);
154
+ let targetId = '#' + $this.data('target');
155
+ $(targetId).val($this.data('value'));
156
+ $(targetId).trigger('change');
157
+ $('.click-select.clean[data-target="' + $this.data('target') + '"]').each(function () { $(this).removeClass('active'); });
158
+ $('.click-select.clean[data-target="' + $this.data('target') + '"][data-value="' + $this.data('value') + '"]').each(function () { $(this).addClass('active'); });
159
+ }
160
+ }
@@ -0,0 +1,25 @@
1
+ import { Alerts } from "./Alerts";
2
+ import { ColorPickers } from "./ColorPicker";
3
+ import { Editors } from "./Editors";
4
+ import { Handlers } from "./Handlers";
5
+ import { Uploader } from "./Uploader";
6
+ declare global {
7
+ interface Hood {
8
+ alerts: Alerts;
9
+ uploader: Uploader;
10
+ handlers: Handlers;
11
+ }
12
+ interface Window {
13
+ hood: Hood;
14
+ }
15
+ }
16
+ export declare class HoodApi implements Hood {
17
+ alerts: Alerts;
18
+ uploader: Uploader;
19
+ handlers: Handlers;
20
+ editors: Editors;
21
+ colorPickers: ColorPickers;
22
+ private mediaModal;
23
+ constructor();
24
+ setupLoaders(): void;
25
+ }
@@ -0,0 +1,22 @@
1
+ import { Alerts } from "./Alerts";
2
+ import { ColorPickers } from "./ColorPicker";
3
+ import { Editors } from "./Editors";
4
+ import { Handlers } from "./Handlers";
5
+ import { MediaModal } from "./Media";
6
+ import { Uploader } from "./Uploader";
7
+ export class HoodApi {
8
+ constructor() {
9
+ this.alerts = new Alerts();
10
+ this.uploader = new Uploader();
11
+ this.handlers = new Handlers();
12
+ this.editors = new Editors();
13
+ this.colorPickers = new ColorPickers();
14
+ this.mediaModal = new MediaModal();
15
+ // Global Handlers
16
+ this.setupLoaders();
17
+ }
18
+ setupLoaders() {
19
+ $('body').on('loader-show', function () { Alerts.success("Showing loader..."); });
20
+ $('body').on('loader-hide', function () { Alerts.error("Hiding loader..."); });
21
+ }
22
+ }
@@ -0,0 +1,27 @@
1
+ import { Response } from "./Response";
2
+ export interface InlineOptions {
3
+ /**
4
+ * Called before the data is fetched.
5
+ */
6
+ onLoad?: (sender?: HTMLElement) => void;
7
+ /**
8
+ * Called before the fetched HTML is rendered to the list. Must return the data back to datalist to render.
9
+ */
10
+ onRender?: (html: string, sender?: HTMLElement) => string;
11
+ /**
12
+ * Called when loading and rendering is complete.
13
+ */
14
+ onComplete?: (html: string, sender?: HTMLElement) => void;
15
+ /**
16
+ * Called when an error occurs.
17
+ */
18
+ onError?: (jqXHR: any, textStatus: any, errorThrown: any) => void;
19
+ }
20
+ export declare class Inline {
21
+ static load(tag: HTMLElement, options: InlineOptions): void;
22
+ static task(url: string, sender: HTMLElement, complete?: (data: Response, sender?: HTMLElement) => void, error?: (jqXHR: any, textStatus: any, errorThrown: any) => void): void;
23
+ static post(url: string, sender: HTMLElement, complete?: (data: Response, sender?: HTMLElement) => void, error?: (jqXHR: any, textStatus: any, errorThrown: any) => void): void;
24
+ static handleError(xhr: {
25
+ status: string | number;
26
+ }, textStatus: any, errorThrown: any): void;
27
+ }
@@ -0,0 +1,63 @@
1
+ import { Alerts } from "./Alerts";
2
+ export class Inline {
3
+ static load(tag, options) {
4
+ var _a;
5
+ let $tag = $(tag);
6
+ $tag.addClass('loading');
7
+ if (options.onLoad) {
8
+ options.onLoad(tag);
9
+ }
10
+ let url = $tag.data('url');
11
+ $.get(url, function (data) {
12
+ if (options.onRender) {
13
+ data = options.onRender(data, tag);
14
+ }
15
+ $tag.html(data);
16
+ $tag.removeClass('loading');
17
+ if (options.onComplete) {
18
+ options.onComplete(data, tag);
19
+ }
20
+ })
21
+ .fail((_a = options.onError) !== null && _a !== void 0 ? _a : Inline.handleError);
22
+ }
23
+ static task(url, sender, complete = null, error = null) {
24
+ if (sender) {
25
+ sender.classList.add('loading');
26
+ }
27
+ $.get(url, function (response) {
28
+ if (sender) {
29
+ sender.classList.remove('loading');
30
+ }
31
+ if (complete) {
32
+ complete(response, sender);
33
+ }
34
+ })
35
+ .fail(error !== null && error !== void 0 ? error : Inline.handleError);
36
+ }
37
+ static post(url, sender, complete = null, error = null) {
38
+ if (sender) {
39
+ sender.classList.add('loading');
40
+ }
41
+ $.post(url, function (response) {
42
+ if (sender) {
43
+ sender.classList.remove('loading');
44
+ }
45
+ if (complete) {
46
+ complete(response, sender);
47
+ }
48
+ })
49
+ .fail(error !== null && error !== void 0 ? error : Inline.handleError);
50
+ }
51
+ static handleError(xhr, textStatus, errorThrown) {
52
+ if (xhr.status === 500) {
53
+ Alerts.error("There was an error processing the content, please contact an administrator if this continues.", "Error " + xhr.status, 10000);
54
+ }
55
+ else if (xhr.status === 404) {
56
+ Alerts.error("The content could not be found.", "Error " + xhr.status, 10000);
57
+ }
58
+ else if (xhr.status === 401) {
59
+ Alerts.error("You are not allowed to view this resource, are you logged in correctly?", "Error " + xhr.status, 10000);
60
+ window.location = window.location;
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,5 @@
1
+ export declare class Loader {
2
+ constructor();
3
+ static show(): void;
4
+ static hide(): void;
5
+ }
@@ -0,0 +1,13 @@
1
+ export class Loader {
2
+ constructor() {
3
+ new CustomEvent('loader-show');
4
+ new CustomEvent('loader-hide');
5
+ }
6
+ static show() {
7
+ $('body').trigger('loader-show');
8
+ }
9
+ static hide() {
10
+ $('body').trigger('loader-hide');
11
+ }
12
+ }
13
+ new Loader();
@@ -0,0 +1,113 @@
1
+ /// <reference types="jquery" />
2
+ import { DataList } from "./DataList";
3
+ import { ModalController } from "./Modal";
4
+ import { Editor } from "tinymce";
5
+ export declare interface MediaObject {
6
+ id: number;
7
+ fileSize: number;
8
+ fileType: string;
9
+ filename: string;
10
+ blobReference: string;
11
+ createdOn: Date;
12
+ url: string;
13
+ thumbUrl: string;
14
+ smallUrl: string;
15
+ mediumUrl: string;
16
+ largeUrl: string;
17
+ uniqueId: string;
18
+ genericFileType: 'Image' | 'PDF' | 'Word' | 'Photoshop' | 'Excel' | 'PowerPoint' | 'Directory' | 'Audio' | 'Video' | 'Unknown';
19
+ downloadUrl: string;
20
+ downloadUrlHttps: string;
21
+ icon: string;
22
+ formattedSize: string;
23
+ path: string;
24
+ }
25
+ export interface MediaOptions {
26
+ /**
27
+ * Action for the media service to take when a media item is clicked.
28
+ */
29
+ action: 'insert' | 'attach' | 'select' | string;
30
+ /**
31
+ * Selector for any elements that require a refresh of background-image or src (if applicable).
32
+ */
33
+ refresh?: string;
34
+ /**
35
+ * Insert/Select Only: Input field to insert image url to.
36
+ */
37
+ size?: string;
38
+ /**
39
+ * Select/Gallery Only: Input field to insert image url to.
40
+ */
41
+ target?: string;
42
+ /**
43
+ * Insert Only: Input field to insert image url to.
44
+ */
45
+ targetEditor?: Editor;
46
+ /**
47
+ * Attach Only: Post url to send the selected media id to when clicked. Must accept mediaId as a parameter.
48
+ */
49
+ url?: string;
50
+ /**
51
+ * Called before the action is carried out.
52
+ */
53
+ beforeAction?: (sender?: HTMLElement) => void;
54
+ /**
55
+ * Called when the action is complete.
56
+ */
57
+ onAction?: (mediaObject: MediaObject, sender?: HTMLElement) => void;
58
+ /**
59
+ * Called before the media list is is fetched.
60
+ */
61
+ onListLoad?: (sender?: HTMLElement) => void;
62
+ /**
63
+ * Called before the fetched HTML is rendered to the media list. Must return the data back to datalist to render.
64
+ */
65
+ onListRender?: (html: string, sender?: HTMLElement) => string;
66
+ /**
67
+ * Called when media list loading and rendering is complete.
68
+ */
69
+ onListComplete?: (html: string, sender?: HTMLElement) => void;
70
+ /**
71
+ * Called when an error occurs.
72
+ */
73
+ onError?: (jqXHR: any, textStatus: any, errorThrown: any) => void;
74
+ }
75
+ export declare class MediaService {
76
+ media: DataList;
77
+ element: HTMLElement;
78
+ options: MediaOptions;
79
+ currentBlade: ModalController;
80
+ progress: JQuery<HTMLElement>;
81
+ progressText: JQuery<HTMLElement>;
82
+ uploadButton: HTMLElement;
83
+ uploader: HTMLElement;
84
+ progressArea: HTMLElement;
85
+ dropzone: any;
86
+ galleryInitialised: boolean;
87
+ constructor(element: HTMLElement, options: MediaOptions);
88
+ initUploader(): void;
89
+ createDirectory(this: MediaService, e: JQuery.ClickEvent): void;
90
+ deleteDirectory(this: MediaService, e: JQuery.ClickEvent): void;
91
+ uploadUrl(): string;
92
+ action(this: MediaService, e: JQuery.ClickEvent): void;
93
+ show(this: MediaService, mediaObject: MediaObject, sender: JQuery.ClickEvent): void;
94
+ select(this: MediaService, mediaObject: MediaObject, e: JQuery.ClickEvent): void;
95
+ insert(this: MediaService, mediaObject: MediaObject, e: JQuery.ClickEvent): void;
96
+ attach(this: MediaService, mediaObject: MediaObject, e: JQuery.ClickEvent): void;
97
+ selectedMedia: MediaObject[];
98
+ galleryClick(this: MediaService, mediaObject: MediaObject, e: JQuery.ClickEvent): void;
99
+ galleryAdd(this: MediaService, e: JQuery.ClickEvent): void;
100
+ isMediaSelected(mediaObject: MediaObject): boolean;
101
+ static refresh(media: MediaObject, refresh: string): void;
102
+ delete(this: MediaService, e: JQuery.ClickEvent): void;
103
+ }
104
+ export declare class MediaModal {
105
+ modal: ModalController;
106
+ list: HTMLElement;
107
+ service: MediaService;
108
+ element: HTMLElement;
109
+ constructor();
110
+ initGallery(this: MediaModal, index: number, element: HTMLElement): void;
111
+ load(this: MediaModal, e: JQuery.ClickEvent): void;
112
+ clear(this: MediaModal, e: JQuery.ClickEvent): void;
113
+ }