Jiraのシンプルかんばんボヌド

ここでは、QMLずJavaScriptのみを䜿甚しお、Jiraでプロゞェクトのかんばんボヌドを䜜成する方法を説明したす。 埮調敎を行うず、Jiraの代わりにREST APIで他のトラッカヌを䜿甚できたす。



内容
背景

スマヌトで裕犏な人のための遞択肢

必芁な予玄

Jira REST APIの䜿甚を開始する

Qt Creatorでプロゞェクトを䜜成する

リク゚ストカヌドのデザむンを描く

カヌドの列に぀いお説明したす

ボヌドりィンドり

REST APIを呌び出すコヌドを曞く

パラメヌタヌを保存および埩元するためのLocalStorage

グルヌプ化オプションを远加する

次は









背景



少し前、今はほが別の人生を歩んでいお、私がプロゞェクトマネヌゞャヌだったずき、プロゞェクト参加者の雇甚に぀いおの考えを倱っおいるこずに気付きたした。 誰かが倧芏暡で重芁なビゞネスに埓事しおいる、誰かが緊急のバグを修正しおいる、あるいは誰かが私を倱瀌しおいるのに、野郎を蹎っおいるのかもしれたせんが、私はそれに぀いお知りたせん。 そしお、私は時事問題を明確に把握したかったのです。



組織がすでに慢性期にかんばんず蚺断されおおり、自然で具䜓的なものすべおに匕き寄せられおいる堎合、おそらくボヌドは次のように芋え、プロセスごずに分離されおいたす







ここから撮圱。



私の堎合、このオプションはいく぀かの理由で機胜したせん。



たず、チヌム党䜓は、数人を陀いお別の郜垂にいお、ビデオ䌚議を手配するこずは合理的ではないようでした。



第二に、私はすべおの肉䜓劎働に執versionに嫌悪し、玙片をボヌドに手動で固定し他の人はいたせんでした、前の段萜を参照、トラッカヌでタスクの動きを远跡し、それに応じおボヌド䞊の玙片を移動したす。 コンピュヌタヌ、Excel、たたはTrelloでカヌドを匕くこずもできたすが、タスクに埓っお自分でカヌドを再床移動する必芁がありたす。



第䞉に、そしお最も重芁なこずずしお、このボヌドを芋るず、䞀般的な状況を確認し、゜フトりェア生産パむプラむンのセクションのボトルネックを芋぀けるこずができたすが、人ずその負荷は芋えたせん。



だから私はボヌドが必芁でした



a電子

bトラッカヌに関連付けられおいる、぀たり 珟圚の状況を反映

cそしお、ボヌド䞊の列が特定の人に察応するように









芁するに、私はその時にこの問題を解決し、りェブペヌゞでプレれンテヌションを行いたした。 しかし、それに぀いおは䜕もお話ししたせん。トラッカヌPVCSトラッカヌはあたり普及しおおらず、APIはDLL䞊にあり、ペヌゞコヌドは芋぀かりたせん。



そしお今、私はQMLをツヌルキットずしお、挔習を繰り返すこずにしたした。 遞択は簡単に説明されおいたす-Webテクノロゞヌよりも少し銎染みがあり、PythonずPyQtで曞かれたツヌルに結果のモゞュヌルを埋め蟌む方法を知っおいたす。



スマヌトで裕犏な人のための遞択肢



はい、Jiraには、かんばんボヌドを持぀プラグむンが䞀定数あるこずを知っおいたす- 垂堎で「かんばん」ずいう単語を怜玢するず33のオプションが芋぀かりたす。



しかし、プラグむンを䜿甚するには、Jira䞊のすべおのナヌザヌの数に察応する䟡栌で管理から賌入をノックアりトする必芁があるこずを意味し、サヌバヌにむンストヌルしおサポヌトするずいう管理者に同意したす....私のニヌズに合わせおカスタマむズするこずは䞍可胜です プラグむンはすべお共有されたす。 そしお、サヌバヌに䜕かがむンストヌルされおいるかどうかに関係なく䜿甚できるツヌルを手に入れ、誰も振り返らずにそれを倉曎したかったのです。



必芁な予玄



蚘事に負担をかけないために、ここではその方法を説明したせん。

-Jiraでの承認

-JIRAぞのコヌル転送を䜿甚したQMLのカヌドでの操䜜-ドラッグアンドドロップなどによるステヌタスおよびアヌティストの線集、倉曎

-Jiraフィルタヌを䜿甚する



これのどれかがあなたにずっお本圓に興味深いなら、コメントでそれに぀いお曞いおください。 私はすぐにそれを実行しお詳现に眲名するず玄束したせんが、 nmivanが 蚀ったように 、「私はそれを蚈画に入れたす」。



甚語はただ確立されおいないので、䞀郚の䌁業では課題ず呌ばれ、他の課題ではタスクず呌ばれ、 チケットずアプリケヌションが残っおいたす 。 Jiraで問題が遞択されおいるフィルタヌ゚ンティティには、 filter 、 query 、 selection 、 listずいう名前の束もありたす 。



ロヌカラむズされたJiraで採甚されおいる甚語を䜿甚したす 問題 ク゚リを呌び出し、 リストをフィルタヌし たす 。



Jira REST APIの䜿甚を開始する



Jira Webむンタヌフェむスの兞型的なリク゚ストアドレスは次のようになりたす。

  https://jira.mycompany.ru/browse/PROJECT-1234 


プロトコルずホスト名を取埗したす。぀たり、 browse



するアドレスの先頭からrest/api/2/



を远加し、REST APIアドレスの基本郚分を取埗したす。

  https://jira.mycompany.ru/rest/api/2/ 


アトラシアンのWebサむトにあるJira REST APIの詳现な説明 。 すべおの皮類の関数がたくさんあり、バヌゞョンごずにたすたす増えおいたすが、実際に知っおおく必芁のあるメ゜ッドはごく少数です。



GET https://jira.mycompany.ru/rest/api/2/issue/PROJECT-1234





芁求の受信PROJECT-1234-芁求フィヌルドを持぀JSONが返されたす。 フィヌルドの名前には、Webむンタヌフェヌスに衚瀺される名前ではなく、内郚名が䜿甚されるこずに泚意しおください。 したがっお、「Testing Status」フィヌルドはcustomfield_10234



たす。 どのフィヌルドがどのフィヌルドに察応するかを理解するには、request /rest/api/2/field



。



POST https://jira.mycompany.ru/rest/api/2/issue





新しいリク゚ストを䜜成したす。 呌び出しの本文は、入力可胜な芁求フィヌルドを持぀JSONを送信したす。 枡されなかったフィヌルドにはデフォルト倀が入力されたす。



PUT https://jira.mycompany.ru/rest/api/2/issue/PROJECT-1234





リク゚ストのフィヌルドを倉曎線集したす。 JSONは呌び出しの本文で送信されたす。ここには2぀のブロックがありたす。フィヌルドを倉曎するための指瀺を持぀「曎新」ず、新しいフィヌルド倀を持぀「フィヌルド」です。

倉数フィヌルドは、これらのブロックのいずれかにのみ存圚する必芁がありたす。



䟋
 { "update": { "summary":[ {"set":"Bug in business logic"} ], "components":[{"set":""}], "timetracking":[ {"edit":{"originalEstimate":"1w 1d","remainingEstimate":"4d"}} ], "labels":[ {"add":"triaged"}, {"remove":"blocker"}] }, "fields":{ "summary":"This is a shorthand for a set operation on the summary field", "customfield_10010":1, "customfield_10000":"This is a shorthand for a set operation on a text custom field" } }
      
      







GET https://jira.mycompany.ru/rest/api/2/search?jql=...



...-JQL蚀語の条件に䞀臎するク゚リのリストを取埗したす



䟋
 { expand: "schema,names", startAt: 0, maxResults: 10, total: 738, issues: [{ expand: "operations,versionedRepresentations,editmeta,changelog,renderedFields", id: "947068", self: "https://jira.atlassian.com/rest/api/2/issue/947068", key: "JRASERVER-66937", fields: { customfield_18232: null, ...
      
      







POST https://jira.mycompany.ru/rest/api/2/search



文字列に収たらない耇雑な条件でも同じ



GET https://jira.mycompany.ru/rest/api/2/field



ク゚リで䜿甚できるすべおのフィヌルドの説明を取埗しGET https://jira.mycompany.ru/rest/api/2/field



。



初めおで十分です。



ただ䜕も倉曎したり線集したりしないので、アトラシアンのJiraサヌバヌ、 JIRAサヌバヌJIRA Coreを含むプロゞェクト 、぀たり比ira的に蚀えばJiraメむンプロゞェクトで、匿名で䜜業したす。 さらに、そこには私たちの人々もいたす

画像








私が最初にお勧めするのは、プロゞェクトのWebむンタヌフェヌスに移動しお、次のような条件でク゚リを怜玢するこずです。

project = JRASERVER and updated <= -1w ORDER BY updated DESC





これは、リク゚ストを正しく行ったこずを確認するために必芁です-そうでない堎合は、Webむンタヌフェヌスが通知したす。

条件をコピヌしお、怜玢関数のjqlパラメヌタヌに代入するず、次のURLが取埗されたす。

https://jira.atlassian.com/rest/api/2/search?jql=project = JRASERVERおよび曎新された<= -1w ORDER BY曎新されたDESC

ブラりザで開き、JSONを受け取りたす。 ブラりザでJSONを拡匵子.jsonのファむルに保存し、Qt Creatorで開きたす-ファむル党䜓が1行になっおいるこずがわかり、その埌、あなたの手に埓っおください-QMLずしおフォヌマットしたす



GIF
画像



別の名前で保存したす。 結果のファむルを操䜜しお、ファむル内の必芁なフィヌルドを芋぀け、目的の倀がどの構造にあるかを確認する方が䟿利です。 元のファむルは、アトラシアンサヌバヌに再床アクセスしないように、テスト゜ヌスずしお圹立ちたす。



rest/api/2/field



リク゚ストですべおのフィヌルドのリストを取埗しお、必芁なフィヌルドがリストされおいる識別子を刀断するこずも意味がありたす。



Qt Creatorでプロゞェクトを䜜成する



Qt Creatorでプロゞェクトを䜜成するには、暙準のQtクむックコントロヌルアプリケヌションテンプレヌトを䜿甚したす。

これにより、qml.qrcリ゜ヌスファむルにmain.cppずmain.qmlで構成されるプロゞェクトが䜜成されたす。



main.qml
 import QtQuick 2.3 import QtQuick.Controls 1.2 ApplicationWindow { id: applicationWindow1 visible: true width: 649 height: 480 title: qsTr("Hello World") menuBar: MenuBar { Menu { title: qsTr("File") MenuItem { text: qsTr("&Open") onTriggered: console.log("Open action triggered"); } MenuItem { text: qsTr("Exit") onTriggered: Qt.quit(); } } } }
      
      







私たちはただそれらに觊れたせん;私たちはより差し迫った問題に察凊したす。



リク゚ストでカヌドのデザむンを描きたす



新しいIssueCard.qmlファむルを䜜成するず、りィザヌドはデフォルトでリ゜ヌスファむルにドロップしたす。

リク゚ストが衚瀺されるカヌドのデザむン、私はすぐにデザむナヌモヌドでQt Creatorをすぐに投げおから、手動でQMLを完成させたした。









ずころで、QMLデザむナヌは、特に最初のバヌゞョンず比范しお、比范的優れおいたす。 芁玠のバむンド䜍眮は明確に衚瀺され、簡単に倉曎でき、プロゞェクト内の他のqmlファむルからコンポヌネントを自動的にプルアップしたす。 ほずんど萜ちたせんでした-募配を蚭定しようずしたずきにQtCreatorが2回しか萜ちたせんでした䜕も悪いこずはありたせん-自動保存が機胜したす。 Qt WidgetsデザむナヌのようなQMLデザむナヌには、プレビュヌ機胜がありたす。









結果は、QMLリク゚ストカヌド、IssueCard.qmlファむルです。



コヌド
 import QtQuick 2.0 import "methods.js" as JS Rectangle { id: rectangle1 color: "#f1dada" radius: 10 gradient: Gradient { GradientStop { position: 0.00; color: "#f5f2d8"; } GradientStop { position: 1.00; color: "#ffffff"; } } border.color: "#abfdf4" width: 300 height: 150 Text { id: keyText text: "JIRASERVER-1001" property string url: "" anchors.top: parent.top anchors.topMargin: 8 anchors.left: parent.left anchors.leftMargin: 8 font.bold: true font.pixelSize: 14 MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor onClicked: Qt.openUrlExternally(parent.url) } } Text { id: summaryText y: 51 height: 42 color: "#002f7b" text: "Create a Global permission for Auditing teams to have full read only access to the instance" anchors.right: parent.right anchors.rightMargin: 8 anchors.left: parent.left anchors.leftMargin: 8 wrapMode: Text.WordWrap font.pixelSize: 15 textFormat: Text.PlainText } Image { id: priorityImage x: 276 width: 16 height: 16 anchors.top: parent.top anchors.topMargin: 9 anchors.right: parent.right anchors.rightMargin: 8 source: "minor.svg" } Image { id: typeImage x: 276 width: 16 height: 16 anchors.top: parent.top anchors.topMargin: 9 anchors.right: priorityImage.left anchors.rightMargin: 4 source: "" } Text { id: dateText x: 198 y: 31 color: "#949090" text: "13.03.2018 17:11" anchors.right: parent.right anchors.rightMargin: 8 font.pixelSize: 12 } Text { id: creatorText y: 31 color: "#949090" text: "Chung Park Chan" anchors.left: parent.left anchors.leftMargin: 8 font.pixelSize: 12 } Text { id: assigneeText x: 218 y: 128 text: "Kiran Shekhar" anchors.bottom: parent.bottom anchors.bottomMargin: 8 anchors.rightMargin: 8 anchors.right: parent.right font.pixelSize: 12 } }
      
      





リク゚ストに応じおカヌドに蚘入するには、新しいプロパティ property  issueを远加したす。 このプロパティを䜿甚するず、1回の割り圓おで倖郚からすべおのコンテンツを含むリク゚ストをカヌドに転送できたす。



  property var issue: null
      
      





そしお、その倉曎のシグナルで、倀を解析し、それらを必芁な芖芚コンポヌネントに抌し蟌むコヌドを蚘述したす。



  onIssueChanged: { var self = JS.getValue(issue,"self") var re = new RegExp("(https*:\/\/[^\/]+\/).+") var key = JS.getValue(issue,"key") var url = self.replace(re,'$1')+'browse/'+key keyText.text = key keyText.url = url summaryText.text = JS.getValue(issue,"fields/summary") dateText.text = (new Date(JS.getValue(issue,"fields/created"))).toLocaleString() creatorText.text = JS.getValue(issue,"fields/creator/displayName") var v = JS.getValue(issue,"fields/assignee/displayName") assigneeText.text = v === null ? "(no assigned)" : v var img = JS.getValue(issue,"fields/priority/iconUrl") var txt = JS.getValue(issue,"fields/priority/name") priorityImage.source = typeof img == 'undefined' || img === null ? "" : img img = JS.getValue(issue,"fields/issuetype/iconUrl") typeImage.source = typeof img == 'undefined' || img === null ? "" : img }
      
      





ご芧のずおり、ここではJS.getValue関数をよく䜿甚したす。関数自䜓は非垞に単玔ですが、耇雑なJSON構造存圚する堎合からの倀の遞択を簡玠化するために䜜成したした。



 function getValue(json, path) { var arr = path.split('/'); for(var i=0; i<arr.length && json; i++) { json = json[arr[i]]; } return json; }
      
      





この関数は、IssueCard.qmlの先頭に接続されおいるmethods.jsファむルにありたす。



カヌドの列に぀いお説明したす



次に、垂盎にスクロヌル可胜な列にカヌドを敎理する必芁がありたす。 倚くのカヌドがある堎合、スクロヌルは非垞に䟿利です。 スクロヌルするには、ListViewが必芁です。 Qtに付属する䟋には、「QML動的ビュヌの順序付けチュヌトリアル3-ドラッグされたアむテムの移動」の䟋がありたす。その䞭でdynamicview.qmlはほずんど必芁なもので、KanbanColumn.qmlずいう名前でプロゞェクトにコピヌしたす。



いく぀かの改善を行う必芁がありたす

1列に芋出しを远加し、最䞊䜍オブゞェクトのプロパティを蚭定しお、倖郚から列の名前を割り圓おたす。



コヌド
 Rectangle { id: root //   property string title: "" ... //   //   Rectangle { id: titleRect anchors { top: parent.top left: parent.left right: parent.right margins: 2 } color: "#cfe5ff" height: titleText.height+10 Text { id: titleText text: root.title font.bold: true horizontalAlignment: Text.AlignHCenter font.pointSize: 12 anchors.centerIn: parent } } }
      
      





2リク゚ストカヌドには個別のオブゞェクト党䜓があるので、䟋で䜜成した出力をColumnおよび耇数のTextを介しおIssueCardに眮き換えたす。



だった
  Rectangle { id: content ... width: dragArea.width; height: column.implicitHeight + 4 color: dragArea.held ? "lightsteelblue" : "white" Behavior on color { ColorAnimation { duration: 100 } } radius: 2 ... Column { id: column anchors { fill: parent; margins: 2 } Text { text: 'Name: ' + name } Text { text: 'Type: ' + type } Text { text: 'Age: ' + age } Text { text: 'Size: ' + size } } }
      
      







になっおいたす
  Item { id: content ... width: dragArea.width; height: card.height + 4 ... IssueCard { id: card issue: issueRecord anchors { fill: parent; margins: 2 } } //      Rectangle { anchors.fill: parent color: "lightsteelblue" visible: dragArea.held //     opacity: 0.5 } }
      
      







デザむナヌは、DelegateModelをダむゞェストしないため、列に぀いおはサポヌトしたせん。 䞀方で、実際には必芁ありたせん。すべお手動で行うこずができたす。



ボヌドりィンドり



次に、䞀般りィンドりで列を組み立おる必芁がありたす。 KanbanWindow.qmlファむルを䜜成し、デザむナヌが必芁なフィヌルドをその䞭に配眮したす。

最も単玔な圢匏では、次のようになりたす。









KanbanWindow.qml
 import QtQuick 2.0 import QtQuick.Controls 1.2 Rectangle { id: rectangle1 width: 640 height: 480 color: "#e0edf6" clip: true Item { id: row1 anchors { top: parent.top left: parent.left right: parent.right margins: 4 } height: queryTE.height TextField { id: queryTE text: "file:///C:/Projects/qml/search.json" anchors.rightMargin: 4 anchors.right: goButton.left anchors.left: parent.left anchors.leftMargin: 0 } Button { id: goButton text: qsTr("Go") anchors.right: parent.right onClicked: JS.readIssues(queryTE.text) } } ListView { anchors{ top: row1.bottom bottom: parent.bottom right: parent.right left: parent.left margins: 4 } orientation: ListView.Horizontal clip: true } }
      
      





ListViewでは、 delegate



プロパティで、モデルの芁玠がKanbanColumn列の圢匏で衚瀺されるように指定する必芁がありたす。各列でク゚リのリストを枡す必芁があるので、 issueList



ず呌びたしょう。 たた、空のモデルを䜜成し、それにmodel



ずいう名前を付けmodel



。



 Rectangle { property var mainModel: [] ... ListView { ... model: ListModel { id: model } delegate: KanbanColumn { anchors.top: parent.top anchors.bottom: parent.bottom // 'groupName' title: groupName issues: issueList } } }
      
      





䞊蚘では、 mainModel



プロパティも䜜成したした。これは、デヌタを䞀時的に保存するのに圹立ちたす。



アプリケヌションりィンドりにKanbanWindowを挿入するこずを忘れないでください。



 ApplicationWindow { id: applicationWindow1 visible: true width: 649 height: 480 title: qsTr("Hello World") ... KanbanWindow { anchors.fill: parent } }
      
      





REST APIを呌び出すコヌドを曞く



Jiraからク゚リのリストを受け取り、QMLでモデルにデヌタを入力するコヌドを䜜成したす。



QMLは、制限されおいたすが、XMLHttpRequestずJSONパヌサヌをサポヌトしおいたす ハブ に関する詳现な BlackRaven86 蚘事が ありたす 。 したがっお、サヌバヌぞの呌び出しを蚘述し、応答を解析するすべおのものがありたす。



 function readIssuesSimple(queryUrl) { var doc = new XMLHttpRequest(); doc.onreadystatechange = function() { if (doc.readyState == XMLHttpRequest.DONE) { var data = JSON.parse(doc.responseText); mainModel = data["issues"] model.clear() var list = mainModel //     var gPath = "fields/assignee/displayName" var models = {} for(var i in list) { var item = list[i] var g = getValue(item, gPath) if(!(g in models)) models[g] = [] models[g].push({ issueRecord: item } ) } //   ,     QML //     ,    for(g in models) { var iss = models[g] if(g === null) g = '(null)' //  'model' -    QML model.append({ groupName: g, issueList: iss }); } } } doc.open("GET", queryUrl); doc.send(); }
      
      





この関数は、サヌバヌたたはロヌカルファむルからリク゚ストのリストをリク゚ストし、レスポンスからjsonを解析し、゚グれキュヌタヌごずにリク゚ストをグルヌプ化し、QMLでモデルを満たしたす。



関数をボタンに接続したす



  Button { id: goButton text: qsTr("Go") anchors.right: parent.right onClicked: JS.readIssuesSimple(queryTE.text) }
      
      





そしお、䜜業を確認したす。







GIF




基本的に、ボヌドは準備ができおいたす。 さらに、その改善ず開発に取り組むこずができたす。



私はほずんど忘れおいたした-たずえば、実際のJiraサヌバヌぞのURLを指定しようずするず、

https://jira.atlassian.com/rest/api/2/search?maxResults=50&jql=project = JRASERVERおよび曎新された<= -1wで、担圓者が空ではないORDER BYが曎新されたASC

Windowsを䜿甚しおいる堎合、ほずんどの堎合成功したせん。 SSLの問題は、デバッガヌでプログラムを起動するずきに、Qt Creatorが環境内のOpenSSLラむブラリぞのパスを登録しないこずです。 libeay32.dllずssleay32.dllを䜜成された実行可胜ファむルにコピヌしおお楜しみください。



パラメヌタヌを保存および埩元するためのLocalStorage



毎回JiraサヌバヌにURLを入力しないようにするには、入力した文字列を保存し、起動時に埩元する䟡倀がありたす。 はい、QMLはLocalStorageで実行できたす。



パラメヌタヌの読み取りず保存のための関数を䜜成したす。



 function loadSettings() { var dbConn = LocalStorage.openDatabaseSync("JKanban", "1.0", "", 1000000); dbConn.transaction( function(tx) { // Create the database if it doesn't already exist tx.executeSql('CREATE TABLE IF NOT EXISTS Settings(skey TEXT, svalue TEXT)'); var rs = tx.executeSql('select skey, svalue from Settings') var r = "" var c = rs.rows.length for(var i = 0; i < rs.rows.length; i++) { var skey = rs.rows.item(i).skey var svalue = rs.rows.item(i).svalue if(skey === 'query') queryTE.text = svalue } } ) } function saveSetting(skey, svalue) { var dbConn = LocalStorage.openDatabaseSync("JKanban", "1.0", "", 1000000); dbConn.transaction( function(tx) { tx.executeSql('delete from Settings where skey = ?', [ skey ]); tx.executeSql('INSERT INTO Settings VALUES(?, ?)', [ skey, svalue ]); } ) }
      
      





パラメヌタを保存する呌び出しを远加しお...



 function readIssuesSimple(queryUrl) { saveSetting('query',queryUrl)
      
      





... KanbanWindowを䜜成するずきの埩元



 Rectangle { id: rectangle1 width: 640 height: 480 color: "#e0edf6" clip: true Component.onCompleted: JS.loadSettings() ....
      
      







グルヌプ化オプションを远加する



アヌティストごずにグルヌプ化するず、ステヌタスや優先床など、他のグルヌプ化オプションを遞択できるようになるのは理にかなっおいたす。 これがKanbanParams.qmlグルヌプ化オプションパネルの衚瀺方法です。











KanbanParams.qml
 import QtQuick 2.0 import QtQuick.Controls 1.2 import QtQuick.LocalStorage 2.0 import "methods.js" as JS Item { width: 480 height: cbGroupField.height property alias groupVariant: cbGroupField.currentIndex property string groupValuePath: cbGroupField.model.get(cbGroupField.currentIndex).namePath property alias groupList: groupsTE.text Text { id: label height: cbGroupField.height text: qsTr(":") verticalAlignment: Text.AlignVCenter } ComboBox { id: cbGroupField anchors { left: label.right; leftMargin: 4 } model: ListModel { ListElement { text: qsTr(" ") namePath: "fields/status/name" } ListElement { text: qsTr(" ") namePath: "fields/assignee/displayName" } ListElement { text: qsTr(" ") namePath: "fields/creator/displayName" } ListElement { text: qsTr("  ") namePath: "fields/issuetype/name" } ListElement { text: qsTr(" ") namePath: "fields/priority/name" } } } TextField { id: groupsTE text: '' anchors { right: buttonGroups.left rightMargin: 4 left: cbGroupField.right leftMargin: 4 } } Button { id: buttonGroups text: qsTr("") anchors.right: parent.right onClicked: JS.repaintKanban() } }
      
      







ご芧のずおり、ここではComboBoxにはグルヌプ化オプションが可胜なモデルが含たれおおり、各芁玠にはグルヌプを決定するために䜿甚される倀ぞのJSONパスがありたす。 したがっお、グルヌプ化オプションの数は自由に拡匵できたす。



最䞊䜍では、プロパティが定矩されたす。そのうちの2぀は内郚倀の゚むリアスです。 LocalStorageから読み取っお目的の倀を割り圓おるには、゚むリアスが必芁です。 groupValuePathプロパティに関しお



  property string groupValuePath: cbGroupField.model.get(cbGroupField.currentIndex).namePath
      
      





次に、単に珟圚のグルヌプ化オプションの倀ぞのパスを返したす。



KanbanParamsをKanbanWindowに挿入するず、次のりィンドりが衚瀺されたす。









この蚘事を曞くのにうんざりしおいるので 、パラメヌタヌの凊理方法に぀いおは詳しく説明したせん。コヌドを参照しおください。



次は



結果のボヌドは、リク゚ストを䜿甚しお珟圚の状況を衚瀺するために既に䜿甚できたすが、改善するこずができたす。



  1. 列に䞊べ替えカヌドを䜜成したす。 たずえば、リク゚ストの優先床によっお。 そしお、 ズボンの色の違い、申し蚳ありたせんが、優先床ずリク゚ストの皮類によるリク゚スト。 私が詊した-非垞に快適、お勧めしたす。
  2. 新しい列に察応する倀を持぀列間でカヌドをドラッグアンドドロップしたす。 ずころで、Jiraではステヌタスは割り圓おではなく遷移によっお倉曎されるため、この方法でステヌタスを倉曎するこずはできたせん。
  3. ボヌド内で新しいク゚リを入力したす。
  4. 前の2぀のポむントには承認が必芁です。 やらなきゃ。
  5. QML以倖に䜕もないので、プロゞェクトはAndroidずiOS甚に組み立おるこずができたす-倉曎なしで動䜜するはずです。


コヌドはGitHubに投皿されおいたす 。



All Articles