Fix plugin item content not updating

Fire an event whenever a Plugin object's relevant members are set, and
handle the event to update the plugin item content if an item for the
Plugin exists.
This commit is contained in:
Oliver Hamlet
2016-03-05 11:49:26 +00:00
parent 3cf7f9eaf1
commit 03bd1150af
3 changed files with 327 additions and 5 deletions
+1
View File
@@ -99,6 +99,7 @@
document.addEventListener('loot-plugin-message-change', Plugin.onContentChange);
document.addEventListener('loot-plugin-isdirty-change', Plugin.onIsDirtyChange);
document.addEventListener('loot-plugin-card-content-change', Plugin.onContentChange);
document.addEventListener('loot-plugin-item-content-change', Plugin.onItemContentChange);
/* Set up event handlers for game member variable changes. */
document.addEventListener('loot-game-folder-change', Game.onFolderChange);
+87 -5
View File
@@ -176,10 +176,10 @@
this.loadsArchive = obj.loadsArchive || false;
this.masterlist = obj.masterlist;
this.userlist = obj.userlist;
this._userlist = obj.userlist;
this.priority = obj.priority || 0;
this.isPriorityGlobal = obj.isPriorityGlobal || false;
this._priority = obj.priority || 0;
this._isPriorityGlobal = obj.isPriorityGlobal || false;
this._messages = obj.messages || [];
this._tags = obj.tags || [];
this._isDirty = obj.isDirty || false;
@@ -187,7 +187,7 @@
/* UI state variables */
this.id = this.name.replace(/\s+/g, '');
this.isMenuOpen = false;
this.isEditorOpen = false;
this._isEditorOpen = false;
this.isConflictFilterChecked = false;
this.isSearchResult = false;
}
@@ -238,6 +238,18 @@
}));
}
_dispatchItemContentChangeEvent() {
document.dispatchEvent(new CustomEvent('loot-plugin-item-content-change', {
detail: {
pluginId: this.id,
priority: this.priority,
isPriorityGlobal: this.isPriorityGlobal,
isEditorOpen: this.isEditorOpen,
hasUserEdits: this.hasUserEdits,
},
}));
}
get messages() {
return this._messages;
}
@@ -330,7 +342,55 @@
}
get hasUserEdits() {
return this.userlist && Object.keys(this.userlist).length > 1;
return this.userlist !== undefined && Object.keys(this.userlist).length > 1;
}
get userlist() {
return this._userlist;
}
set userlist(userlist) {
if (!_.isEqual(this._userlist, userlist)) {
this._userlist = userlist;
this._dispatchItemContentChangeEvent();
}
}
get priority() {
return this._priority;
}
set priority(priority) {
if (this._priority !== priority) {
this._priority = priority;
this._dispatchItemContentChangeEvent();
}
}
get isPriorityGlobal() {
return this._isPriorityGlobal;
}
set isPriorityGlobal(isPriorityGlobal) {
if (this._isPriorityGlobal !== isPriorityGlobal) {
this._isPriorityGlobal = isPriorityGlobal;
this._dispatchItemContentChangeEvent();
}
}
get isEditorOpen() {
return this._isEditorOpen;
}
set isEditorOpen(isEditorOpen) {
if (this._isEditorOpen !== isEditorOpen) {
this._isEditorOpen = isEditorOpen;
this._dispatchItemContentChangeEvent();
}
}
getCardContent(filters) {
@@ -358,5 +418,27 @@
card.updateContent();
}
}
static onItemContentChange(evt) {
const item = document.getElementById('cardsNav').querySelector(`[data-id="${evt.detail.pluginId}"]`);
if (item) {
item.setAttribute('priority', evt.detail.priority);
if (evt.detail.isPriorityGlobal) {
item.setAttribute('is-priority-global', '');
} else {
item.removeAttribute('is-priority-global');
}
if (evt.detail.isEditorOpen) {
item.setAttribute('is-editor-open', '');
} else {
item.removeAttribute('is-editor-open');
}
if (evt.detail.hasUserEdits) {
item.setAttribute('has-user-edits', '');
} else {
item.removeAttribute('has-user-edits');
}
}
}
};
}));
+239
View File
@@ -646,6 +646,245 @@ describe('Plugin', () => {
});
});
describe('#userlist', () => {
let handleEvent;
afterEach(() => {
document.removeEventListener('loot-plugin-item-content-change', handleEvent);
});
it('getting value should return undefined if it has not been set in the constructor', () => {
const plugin = new loot.Plugin({ name: 'test' });
should(plugin.userlist).be.undefined();
});
it('getting value should return the value that was set', () => {
const plugin = new loot.Plugin({
name: 'test',
userlist: {},
});
plugin.userlist.should.deepEqual({});
});
it('setting value should store set value', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.userlist = {};
plugin.userlist.should.deepEqual({});
});
it('setting value to the current value should not fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = () => {
done(new Error('Should not have fired an event'));
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.userlist = plugin.userlist;
setTimeout(done, 100);
});
it('setting value not equal to the current value should fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = (evt) => {
evt.detail.pluginId.should.equal(plugin.id);
evt.detail.priority.should.equal(plugin.priority);
evt.detail.isPriorityGlobal.should.equal(plugin.isPriorityGlobal);
evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen);
evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits);
done();
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.userlist = { priority: 1 };
});
});
describe('#priority', () => {
let handleEvent;
afterEach(() => {
document.removeEventListener('loot-plugin-item-content-change', handleEvent);
});
it('getting value should return 0 if it has not been set in the constructor', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.priority.should.equal(0);
});
it('getting value should return the value that was set', () => {
const plugin = new loot.Plugin({
name: 'test',
priority: 5,
});
plugin.priority.should.equal(5);
});
it('setting value should store set value', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.priority = 5;
plugin.priority.should.equal(5);
});
it('setting value to the current value should not fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = () => {
done(new Error('Should not have fired an event'));
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.priority = plugin.priority;
setTimeout(done, 100);
});
it('setting value not equal to the current value should fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = (evt) => {
evt.detail.pluginId.should.equal(plugin.id);
evt.detail.priority.should.equal(plugin.priority);
evt.detail.isPriorityGlobal.should.equal(plugin.isPriorityGlobal);
evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen);
evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits);
done();
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.priority = 5;
});
});
describe('#isPriorityGlobal', () => {
let handleEvent;
afterEach(() => {
document.removeEventListener('loot-plugin-item-content-change', handleEvent);
});
it('getting value should return false if it has not been set in the constructor', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.isPriorityGlobal.should.be.false();
});
it('getting value should return the value that was set', () => {
const plugin = new loot.Plugin({
name: 'test',
isPriorityGlobal: true,
});
plugin.isPriorityGlobal.should.be.true();
});
it('setting value should store set value', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.isPriorityGlobal = true;
plugin.isPriorityGlobal.should.be.true();
});
it('setting value to the current value should not fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = () => {
done(new Error('Should not have fired an event'));
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.isPriorityGlobal = plugin.isPriorityGlobal;
setTimeout(done, 100);
});
it('setting value not equal to the current value should fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = (evt) => {
evt.detail.pluginId.should.equal(plugin.id);
evt.detail.priority.should.equal(plugin.priority);
evt.detail.isPriorityGlobal.should.equal(plugin.isPriorityGlobal);
evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen);
evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits);
done();
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.isPriorityGlobal = true;
});
});
describe('#isEditorOpen', () => {
let handleEvent;
afterEach(() => {
document.removeEventListener('loot-plugin-item-content-change', handleEvent);
});
it('getting value should return false if it has not been set in the constructor', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.isEditorOpen.should.be.false();
});
it('setting value should store set value', () => {
const plugin = new loot.Plugin({ name: 'test' });
plugin.isEditorOpen = true;
plugin.isEditorOpen.should.be.true();
});
it('setting value to the current value should not fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = () => {
done(new Error('Should not have fired an event'));
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.isEditorOpen = plugin.isEditorOpen;
setTimeout(done, 100);
});
it('setting value not equal to the current value should fire an event', (done) => {
const plugin = new loot.Plugin({ name: 'test' });
handleEvent = (evt) => {
evt.detail.pluginId.should.equal(plugin.id);
evt.detail.priority.should.equal(plugin.priority);
evt.detail.isPriorityGlobal.should.equal(plugin.isPriorityGlobal);
evt.detail.isEditorOpen.should.equal(plugin.isEditorOpen);
evt.detail.hasUserEdits.should.equal(plugin.hasUserEdits);
done();
};
document.addEventListener('loot-plugin-item-content-change', handleEvent);
plugin.isEditorOpen = true;
});
});
describe('#getCardContent()', () => {
let plugin;
beforeEach(() => {