Skip to content

Commit bb8559d

Browse files
authored
Merge pull request #3013 from MisRob/fix-updates-of-channel-details-not-visible
Content defaults reactivity fixes
2 parents a81fe41 + 0d8b727 commit bb8559d

File tree

3 files changed

+76
-38
lines changed

3 files changed

+76
-38
lines changed

contentcuration/contentcuration/frontend/shared/views/channel/ChannelModal.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,8 @@
244244
contentDefaults: {
245245
get() {
246246
return {
247-
...(this.diffTracker.content_defaults || {}),
248247
...(this.channel.content_defaults || {}),
248+
...(this.diffTracker.contentDefaults || {}),
249249
};
250250
},
251251
set(contentDefaults) {

contentcuration/contentcuration/frontend/shared/views/form/ContentDefaults.vue

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
counter
1717
data-name="author"
1818
:label="$tr('author')"
19-
@change="emitChange"
2019
/>
2120
<VTextField
2221
v-model="provider"
@@ -25,7 +24,6 @@
2524
counter
2625
data-name="provider"
2726
:label="$tr('provider')"
28-
@change="emitChange"
2927
/>
3028
<VTextField
3129
v-model="aggregator"
@@ -34,7 +32,6 @@
3432
counter
3533
data-name="aggregator"
3634
:label="$tr('aggregator')"
37-
@change="emitChange"
3835
/>
3936
<VTextField
4037
v-model="copyrightHolder"
@@ -43,7 +40,6 @@
4340
counter
4441
data-name="copyrightHolder"
4542
:label="$tr('copyrightHolder')"
46-
@change="emitChange"
4743
/>
4844
<VSelect
4945
v-model="license"
@@ -52,7 +48,6 @@
5248
:items="licenseOpts"
5349
:label="$tr('license')"
5450
menuProps="offsetY"
55-
@change="emitChange"
5651
/>
5752
<VTextarea
5853
v-if="isCustomLicense"
@@ -63,7 +58,6 @@
6358
data-name="licenseDescription"
6459
:label="$tr('licenseDescription')"
6560
auto-grow
66-
@change="emitChange"
6761
/>
6862
</fieldset>
6963

@@ -77,28 +71,24 @@
7771
class="mt-2"
7872
data-name="autoDeriveVideoThumbnail"
7973
:label="$tr('videos')"
80-
@change="emitChange"
8174
/>
8275
<Checkbox
8376
v-model="autoDeriveAudioThumbnail"
8477
class="mt-2"
8578
data-name="autoDeriveAudioThumbnail"
8679
:label="translateConstant('audio')"
87-
@change="emitChange"
8880
/>
8981
<Checkbox
9082
v-model="autoDeriveHtml5Thumbnail"
9183
class="mt-2"
9284
data-name="autoDeriveHtml5Thumbnail"
9385
:label="$tr('html5')"
94-
@change="emitChange"
9586
/>
9687
<Checkbox
9788
v-model="autoDeriveDocumentThumbnail"
9889
class="mt-2"
9990
data-name="autoDeriveDocumentThumbnail"
10091
:label="$tr('documents')"
101-
@change="emitChange"
10292
/>
10393
</fieldset>
10494
</div>
@@ -124,6 +114,25 @@
124114
}, {});
125115
}
126116
117+
function camelToSnakeCase(contentDefaults) {
118+
return Object.entries(ContentDefaults).reduce((data, [snakeCaseName, camelCaseName]) => {
119+
const value = contentDefaults[camelCaseName] === '' ? null : contentDefaults[camelCaseName];
120+
return Object.assign(data, { [snakeCaseName]: value });
121+
}, {});
122+
}
123+
124+
function generateGetterSetter(key) {
125+
return {
126+
get() {
127+
return this.normalized[key];
128+
},
129+
set(value) {
130+
this.normalized[key] = value;
131+
this.emitChange();
132+
},
133+
};
134+
}
135+
127136
export default {
128137
name: 'ContentDefaults',
129138
components: {
@@ -152,22 +161,29 @@
152161
},
153162
},
154163
data() {
155-
const normalized = normalizeContentDefaults(this.contentDefaults);
156-
157164
return {
158-
author: normalized.author,
159-
provider: normalized.provider,
160-
aggregator: normalized.aggregator,
161-
copyrightHolder: normalized.copyrightHolder,
162-
license: findLicense(normalized.license, { license_name: '' }).license_name,
163-
licenseDescription: normalized.licenseDescription,
164-
autoDeriveAudioThumbnail: normalized.autoDeriveAudioThumbnail,
165-
autoDeriveDocumentThumbnail: normalized.autoDeriveDocumentThumbnail,
166-
autoDeriveHtml5Thumbnail: normalized.autoDeriveHtml5Thumbnail,
167-
autoDeriveVideoThumbnail: normalized.autoDeriveVideoThumbnail,
165+
normalized: normalizeContentDefaults(this.contentDefaults),
168166
};
169167
},
170168
computed: {
169+
author: generateGetterSetter('author'),
170+
provider: generateGetterSetter('provider'),
171+
aggregator: generateGetterSetter('aggregator'),
172+
copyrightHolder: generateGetterSetter('copyrightHolder'),
173+
licenseDescription: generateGetterSetter('licenseDescription'),
174+
autoDeriveAudioThumbnail: generateGetterSetter('autoDeriveAudioThumbnail'),
175+
autoDeriveDocumentThumbnail: generateGetterSetter('autoDeriveDocumentThumbnail'),
176+
autoDeriveHtml5Thumbnail: generateGetterSetter('autoDeriveHtml5Thumbnail'),
177+
autoDeriveVideoThumbnail: generateGetterSetter('autoDeriveVideoThumbnail'),
178+
license: {
179+
get() {
180+
return findLicense(this.normalized.license, { license_name: '' }).license_name;
181+
},
182+
set(value) {
183+
this.normalized['license'] = value;
184+
this.emitChange();
185+
},
186+
},
171187
licenseOpts() {
172188
const licenseOpts = LicensesList.map(license => ({
173189
value: license.license_name,
@@ -184,20 +200,14 @@
184200
return findLicense(this.license, { is_custom: false }).is_custom;
185201
},
186202
},
203+
watch: {
204+
contentDefaults(newValue) {
205+
this.normalized = normalizeContentDefaults(newValue);
206+
},
207+
},
187208
methods: {
188209
emitChange() {
189-
// When any field in our component changes, this gets triggered which then triggers the
190-
// event that updates the prop passed into us as `contentDefaults` in the parent component.
191-
// This assigns the data into a object, with snake cased keys instead of camel cased here
192-
this.$nextTick(() => {
193-
this.$emit(
194-
'change',
195-
Object.entries(ContentDefaults).reduce((data, [snakeCaseName, camelCaseName]) => {
196-
const value = this[camelCaseName] === '' ? null : this[camelCaseName];
197-
return Object.assign(data, { [snakeCaseName]: value });
198-
}, {})
199-
);
200-
});
210+
this.$emit('change', camelToSnakeCase(this.normalized));
201211
},
202212
},
203213
$trs: {

contentcuration/contentcuration/frontend/shared/views/form/__tests__/contentDefaults.spec.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ function updateFormValues(wrapper, contentDefaults) {
100100

101101
describe('contentDefaults', () => {
102102
describe('initial state', () => {
103-
it('should fill fields with defaults', () => {
103+
it('should fill fields with provided content defaults', () => {
104104
const contentDefaults = {
105105
author: 'Buster McTester',
106106
provider: 'USA',
@@ -117,7 +117,7 @@ describe('contentDefaults', () => {
117117
assertFormValues(wrapper, contentDefaults);
118118
});
119119

120-
it('should fill fields with defaults', () => {
120+
it('should fill fields with default values when no content defaults provided', () => {
121121
const wrapper = makeWrapper({});
122122
assertFormValues(wrapper, constants.ContentDefaultsDefaults);
123123
});
@@ -131,7 +131,35 @@ describe('contentDefaults', () => {
131131
});
132132

133133
describe('updating state', () => {
134-
it('should fill fields with defaults', () => {
134+
it('should update fields with new content defaults received from a parent', () => {
135+
const contentDefaults = {
136+
author: 'Buster McTester',
137+
provider: 'USA',
138+
aggregator: 'Aggregator R Us',
139+
copyright_holder: 'Learning Equality',
140+
license: 'Special Permissions',
141+
license_description: 'You need to ask Buster first.',
142+
auto_derive_audio_thumbnail: false,
143+
auto_derive_document_thumbnail: true,
144+
auto_derive_html5_thumbnail: true,
145+
auto_derive_video_thumbnail: false,
146+
};
147+
const wrapper = makeWrapper(contentDefaults);
148+
assertFormValues(wrapper, contentDefaults);
149+
150+
wrapper.setProps({
151+
contentDefaults: {
152+
...contentDefaults,
153+
author: 'Gabhowla Gabrielleclaw',
154+
},
155+
});
156+
assertFormValues(wrapper, {
157+
...contentDefaults,
158+
author: 'Gabhowla Gabrielleclaw',
159+
});
160+
});
161+
162+
it('should update a parent with new content defaults', () => {
135163
const setValues = {
136164
author: 'Buster McTester',
137165
provider: 'USA',

0 commit comments

Comments
 (0)