diff --git a/marko/page/data/components/character-list/index.marko b/marko/page/data/components/character-list/index.marko
index e2943e1..2e9d159 100644
--- a/marko/page/data/components/character-list/index.marko
+++ b/marko/page/data/components/character-list/index.marko
@@ -1,5 +1,9 @@
-
+
\ No newline at end of file
diff --git a/marko/page/data/components/character-nicks-modal/component.js b/marko/page/data/components/character-nicks-modal/component.js
new file mode 100644
index 0000000..9a6f4fa
--- /dev/null
+++ b/marko/page/data/components/character-nicks-modal/component.js
@@ -0,0 +1,66 @@
+const moment = require("moment")
+
+const {charactersApi} = require("../../../../../rpdata/api/Character")
+
+module.exports = class {
+ onCreate(input) {
+ this.state = {
+ error: null,
+ loading: false,
+ values: {
+ newNick: "",
+ }
+ }
+ }
+
+ change(key, ev) {
+ this.state.values[key] = ev.target.value
+ }
+
+ open() {
+
+ }
+
+ close() {
+ this.emit("close")
+ }
+
+ addNick() {
+ if (this.state.loading) {
+ return
+ }
+
+ const input = {id: this.input.character.id, nick: this.state.values.newNick}
+
+ this.state.loading = true
+ charactersApi.addNick(input).then((res) => {
+ this.emit("nicks", res.nicks)
+ this.state.values = {newNick: ""}
+ }).catch(errs => {
+ console.warn("Failed to add nick:", errs)
+
+ this.state.error = "Failed to add nick: " + errs[0].message
+ }).then(() => {
+ this.state.loading = false
+ })
+ }
+
+ removeNick(nick) {
+ if (this.state.loading) {
+ return
+ }
+
+ const input = {id: this.input.character.id, nick}
+
+ this.state.loading = true
+ charactersApi.removeNick(input).then((res) => {
+ this.emit("nicks", res.nicks)
+ }).catch(errs => {
+ console.warn("Failed to remove nick:", errs)
+
+ this.state.error = "Failed to remove nick: " + errs[0].message
+ }).then(() => {
+ this.state.loading = false
+ })
+ }
+}
\ No newline at end of file
diff --git a/marko/page/data/components/character-nicks-modal/index.marko b/marko/page/data/components/character-nicks-modal/index.marko
new file mode 100644
index 0000000..ef0b2cf
--- /dev/null
+++ b/marko/page/data/components/character-nicks-modal/index.marko
@@ -0,0 +1,18 @@
+
+ Manage Nicks
+
+ ${state.error}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/marko/page/data/components/character-nicks-modal/style.less b/marko/page/data/components/character-nicks-modal/style.less
new file mode 100644
index 0000000..604c6e2
--- /dev/null
+++ b/marko/page/data/components/character-nicks-modal/style.less
@@ -0,0 +1,34 @@
+div.add-nick-row {
+ vertical-align: middle !important;
+ margin-top: -1em;
+
+ input {
+ vertical-align: middle !important;
+ display: inline-block !important;
+ width: 78% !important;
+ margin: 0 !important;
+ }
+
+ button {
+ vertical-align: middle !important;
+ display: inline-block !important;
+ width: 20% !important;
+ padding: 0.5em 0 !important;
+ }
+}
+
+div.existing-nick-row {
+ padding: 0.25em;
+ border-bottom: 1px solid rgba(0, 220, 255, 0.125);
+
+ div.content {
+ width: 80%;
+ display: inline-block;
+ }
+
+ button {
+ width: 20% !important;
+ display: inline-block !important;
+ margin: 0 !important;
+ }
+}
\ No newline at end of file
diff --git a/marko/page/data/components/character/index.marko b/marko/page/data/components/character/index.marko
index da926c8..a2621e5 100644
--- a/marko/page/data/components/character/index.marko
+++ b/marko/page/data/components/character/index.marko
@@ -5,8 +5,10 @@
Edit
+ Nicks
Remove
+
\ No newline at end of file
diff --git a/marko/page/data/components/characters-page/component.js b/marko/page/data/components/characters-page/component.js
index 5bc62d3..4417c16 100644
--- a/marko/page/data/components/characters-page/component.js
+++ b/marko/page/data/components/characters-page/component.js
@@ -33,4 +33,16 @@ module.exports = class {
characterAdded(character) {
this.state.characters = this.state.characters.concat(character)
}
+
+ characterNicksChanged(character, nicks) {
+ const characters = this.state.characters.slice()
+ const index = characters.findIndex(c => c.id === character.id)
+ if (index === -1) {
+ return
+ }
+
+ characters[index] = Object.assign(characters[index], {nicks: nicks.slice(), nick: (nicks[0] || "")})
+
+ this.state.characters = characters
+ }
}
\ No newline at end of file
diff --git a/marko/page/data/components/characters-page/index.marko b/marko/page/data/components/characters-page/index.marko
index 5040783..d20dee9 100644
--- a/marko/page/data/components/characters-page/index.marko
+++ b/marko/page/data/components/characters-page/index.marko
@@ -1,5 +1,5 @@
-
+
diff --git a/rpdata/api/Character.js b/rpdata/api/Character.js
index c320edd..c8355de 100644
--- a/rpdata/api/Character.js
+++ b/rpdata/api/Character.js
@@ -102,6 +102,44 @@ class ChracterAPI {
})
}
+ /**
+ * Call `addCharacterNick(input)` mutation, returns new nick list.
+ *
+ * @param {{id:string, nick:string}} input
+ * @returns {Promise<{id:string, nicks:string[]}>}
+ */
+ addNick(input) {
+ return query(`
+ mutation AddCharacterNick($input: CharacterNickInput!) {
+ addCharacterNick(input: $input) {
+ id
+ nicks
+ }
+ }
+ `, {input}, {permissions: ["member", "character.edit"]}).then(({addCharacterNick}) => {
+ return addCharacterNick
+ })
+ }
+
+ /**
+ * Call `removeCharacterNick(input)` mutation, returns new nick list.
+ *
+ * @param {{id:string, nick:string}} input
+ * @returns {Promise<{id:string, nicks:string[]}>}
+ */
+ removeNick(input) {
+ return query(`
+ mutation RemoveCharacterNick($input: CharacterNickInput!) {
+ removeCharacterNick(input: $input) {
+ id
+ nicks
+ }
+ }
+ `, {input}, {permissions: ["member", "character.edit"]}).then(({removeCharacterNick}) => {
+ return removeCharacterNick
+ })
+ }
+
/**
* Call `removeCharacter(input)` mutation
*